2016-09-16 238 views
2

我得到了来自我无法控制的第三方的JSON响应。有时候这个响应会在字符串的末尾抛出非法字符。这是一个正确的例子。在C#反序列化之前从JSON字符串中删除非法字符

{ 
    "result": [ 
     { 
      "parent": "", 
      "made_sla": "true", 
      "caused_by": "", 
      "watch_list": "", 
      "upon_reject": "cancel", 
      "sys_updated_on": "2016-09-13 19:00:01", 
      "approval_history": "", 
      "category": "SPIN Station" 
     } 
    ] 
} 

错误字符串的示例。在这里你可以看到最后它会抛出额外的逗号而不是关闭。

{ 
    "result": [ 
     { 
      "parent": "", 
      "made_sla": "true", 
      "caused_by": "", 
      "watch_list": "", 
      "upon_reject": "cancel", 
      "sys_updated_on": "2016-09-13 19:00:01", 
      "approval_history": "", 
      "category": "SPIN Station" 
     } 
    ], 

这是我在c#中的代码。谁能告诉下面的反序列化

WebRequest req = WebRequest.Create(@"https://aaaa.service-now.com/api/now/table/incident?sysparm_query=sys_updated_onBETWEENjavascript:gs.dateGenerate('2016-09-10','00:00:00')@javascript:gs.dateGenerate('2016-09-13','23:59:59')"); 
    req.Method = "GET"; 
    req.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("username:Password")); 
    req.ContentType = "application/xml"; 

    HttpWebResponse resp = req.GetResponse() as HttpWebResponse; 
    var responseValue = string.Empty; 
    using (var responseStream = resp.GetResponseStream()) 
    { 

      if (responseStream != null) 
       using (var reader = new StreamReader(responseStream)) 
        responseValue = reader.ReadToEnd(); 
    } 

    JavaScriptSerializer ser = new JavaScriptSerializer(); 
    ser.MaxJsonLength = 2147483647; 
    ser.RegisterConverters(new List<JavaScriptConverter> { new ResultConverter() }); 
    RootObject ro = ser.Deserialize<RootObject>(responseValue); 
+1

第1步是严厉打击那些给你不良数据的公司,以解决他们的问题。如果他们没有构建正确的JSON,那么他们很可能会手动构建字符串,所以很可能他们也会搞砸其他JSON规则,这是您无法预测或解决的。 –

+3

你确定你没有得到部分味精吗? – Plutonix

+0

但是,这个错误是随机的,有时它会抛出,有时不会,我认为它与C#的东西比公司发送的东西。每条记录我们可以获得50,000条记录和85个字段。 –

回答

0

我看你正在连接的ServiceNow之前,如何在代码中的响应值串关花括号代替非法逗号。如果你收到一个格式不正确的JSON字符串,这很奇怪 - 我会用hi.service-now.com提出一张票

如果你确实需要纠正你的方面,那么在反序列化之前处理你的responseValue。

if (responseValue.Substring(responseValue.Length-2, 2)=="],") { 
responseValue = responseValue.Remove(str.Length -1, 1) + "}"; 
} 

p.s.我没有测试过 - 你需要仔细看看输入的JSON字符串,以确保没有尾随空格。