2016-09-16 13 views
2

Я получаю ответ JSON от третьей стороны, которую я не могу контролировать. Иногда этот ответ вызывает недопустимые символы в конце строки. Вот пример правильного.Удалить дескриптор из строки JSON перед десериализацией в C#

{ 
    "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

Вы уверены, что у вас есть частичный msg? – Plutonix

+0

Но эта ошибка возникает случайно, иногда она бросает, а иногда и не делает, я думаю, что это что-то с C#, чем отправка компании. Мы получаем 50 000 записей и 85 полей для каждой записи. –

ответ

0

Я вижу, вы подключаетесь к ServiceNow. Это странно, если вы получаете неверную строку JSON - я бы поднял билет с помощью hi.service-now.com

Если вам нужно исправить свою сторону, тогда примените свой ответ. Перед тем, как начать десериализацию.

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

p.s. Я не тестировал - и вам нужно внимательно изучить входную строку JSON, чтобы убедиться, что нет хвостовых пространств.