【问题标题】:Invalid JSON Primitive - Custom Serialization/Deserialization无效的 JSON 基元 - 自定义序列化/反序列化
【发布时间】:2015-10-12 13:56:23
【问题描述】:

我有一个从网络服务返回的 JSON 文件..

facilityName: Ragley DRI01{
  "DataCenterManager": {
    "first": "",
    "second": "Cory Kemp"
  },
  "RegionalDataCenterManager": {
    "first": "",
    "second": "John Farrell"
  },
  "LastUpdatedBy": {
    "first": "DCInfoSyncRole",
    "second": "v-asalam"
  },
  "Client": {
    "first": "DCInfoSyncRole",
    "second": "FacilityMasterPortal"
  }
}
facilityName: Quitman, MEI01{
  "DataCenterManager": {
    "first": "",
    "second": "Cory Kemp"
  },
  "RegionalDataCenterManager": {
    "first": "",
    "second": "John Farrell"
  },
  "LastUpdatedBy": {
    "first": "DCInfoSyncRole",
    "second": "v-asalam"
  },
  "Client": {
    "first": "DCInfoSyncRole",
    "second": "FacilityMasterPortal"
  }
}

根据JSONLint,我知道它是无效的,但我必须将此 JSON 对象反序列化为结构化 DataTable。

我需要自定义序列化/反序列化吗?

非常感谢任何不使用 JSON.net 的帮助..

【问题讨论】:

  • 如果Json无效,则不是Json,是字符串。因此,您需要自己解析它。
  • 我真的很恼火,有人明显费尽心思尝试返回 JSON,然后在最后一关放弃了。
  • JSONLint 甚至说混乱是无效的 JSON。

标签: c# .net json serialization deserialization


【解决方案1】:

恐怕您所面临的可怕格式与真正的 JSON 相差甚远,以至于 JSON 解析器需要对其进行调整来解析它。您可以做的最好的事情是手动将其转换为有效的 JSON,然后像往常一样继续解析。

当然,这容易出错且脆弱,但如果你真的需要这样做,这是可能的。像这样的事情可以作为一个开始

 var resultBuilder = new StringBuilder();
 resultBuilder.Append("[");

 var facilityNameRegex = new Regex("facilityName: ((.)+(?={))");
 var facilities = facilityNameRegex.Matches(text);
 var lastIndex = facilities.Count - 1;

 for (int i = 0; i <= lastIndex; i++)
 {
     var facilityName = facilities[i].Groups[1].Value;

     var bodyStartIndex = facilities[i].Index + facilities[i].Length;

     var body = (i < lastIndex) ?
         text.Substring(bodyStartIndex, facilities[i + 1].Index - bodyStartIndex)
         : text.Substring(bodyStartIndex);

     resultBuilder.AppendFormat("{{\"facilityName\": {0}, \"settings\": {1}}}",
         HttpUtility.JavaScriptStringEncode(facilityName, addDoubleQuotes: true),
         body);

     if (i != lastIndex)
     {
         resultBuilder.Append(",");
     }
 }

 resultBuilder.Append("]");

 Console.WriteLine(resultBuilder.ToString()); // result is a valid JSON array

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2011-04-12
    • 2013-01-18
    相关资源
    最近更新 更多