我有一个从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的帮助..
答案 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