2016-09-16 15 views
2

私が制御できないサードパーティからのJSON応答を取得しています。時々、この応答は文字列の最後に不正な文字を投げます。ここに正しい例があります。デシリアライズする前に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#です。誰もが、私はあなたがServiceNowに接続されている参照

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

しかし、そのエラーは無作為に、時にはそれをスローし、時にはdoesnot、私はその会社の送信よりもCの何かと思います。レコードごとに50,000レコードと85フィールドが得られます。 –

答えて

0

をデシリアライズする前に、以下のコードでの応答値の列に中括弧を閉じると、不正なカンマを交換する方法を教えてもらえます。間違ったJSON文字列を受け取っている場合 - hi.service-now.comでチケットを発行します

あなたの側を修正する必要がある場合は、逆シリアル化する前にresponseValueを操作してください。

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

p.s.私はテストしていません - テリングスペースがないことを確認するには、入力JSON文字列を詳しく調べる必要があります。

関連する問題