2016-09-16 106 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字符串,以確保沒有尾隨空格。