2015-10-12 96 views
0

我这是从Web服务返回的JSON文件..无效的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这个对象结构数据表。

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

不使用JSON.net最能理解的任何帮助..

+2

如果JSON无效,那么它不是JSON,它是一个字符串。因此你需要自己解析它。 – Liam

+0

这真的惹恼了我,有人清楚地去试图返回JSON的麻烦,然后在最后一关就放弃了。 – Phylogenesis

+0

JSONLint甚至说这个混乱是无效的JSON。 – Becuzz

回答

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 
+0

谢谢@ovolka .. –