2016-09-16 2 views
2

Je reçois une réponse JSON de tiers que je ne peux pas contrôler. Parfois, cette réponse jette des caractères illégaux à la fin de la chaîne. Voici un exemple de correct.Supprimer un caractère illégal de la chaîne JSON avant de désérialiser dans 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" 
     } 
    ] 
} 

Un exemple de chaîne incorrecte. Ici, vous pouvez enfin voir qu'il ajoute une virgule au lieu de la fermer.

{ 
    "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" 
     } 
    ], 

Voici mon code en C#. Quelqu'un peut-il dire comment remplacer la virgule illégale avec fermeture accolade dans la chaîne de valeur de réponse dans le code ci-dessous avant désérialisation

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

L'étape 1 consiste à repousser durement contre l'entreprise qui vous donne de mauvaises données, pour réparer leurs affaires. S'ils ne construisent pas correctement un JSON, il y a de fortes chances qu'ils construisent la chaîne manuellement. Il est donc fort possible qu'ils bousillent également d'autres règles JSON, que vous ne pouvez pas prédire ou contourner. –

+3

Etes-vous sûr de ne pas avoir de msg partiel? – Plutonix

+0

Mais cette erreur vient aléatoirement, parfois elle jette et parfois pas, je pense que c'est quelque chose avec C# que l'envoi de l'entreprise. Nous obtenons 50 000 enregistrements et 85 champs pour chaque enregistrement. –

Répondre

0

Je vois que vous vous connectez à ServiceNow. C'est bizarre si vous recevez une chaîne JSON malformée - Je lèverais un ticket avec hi.service-now.com

Si vous avez besoin de corriger votre côté puis manipuler votre responseValue avant de désérialiser.

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

p.s. Je n'ai pas testé - et vous devez regarder de plus près la chaîne JSON d'entrée pour vous assurer qu'il n'y a pas d'espace pour les résidus.