无效的JSON原语 - 自定义序列化/反序列化

时间:2015-10-12 13:56:23

标签: c# .net json serialization deserialization

我有一个从Web服务返回的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的帮助..

1 个答案:

答案 0 :(得分: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