Je communique avec une API tierce qui renvoie les réponses JSON comme suit:
"{\"SomeResponse\":{\"FIrstAttribute\":8,\"SecondAttribute\":\"On\",\"ThirdAttribute\":{\"Id\":2,\"FirstName\":\"Okkie\",\"Name\":\"Bokkie\",\"Street\":\"\",\"StreetNumber\":null,\"PostCode\":\"\",\"City\":\"\",\"Country\":\"}}}"
C'est une sorte de JSON ... mais comme une chaîne. Notez les guillemets doubles finaux et finaux et bien sûr toutes les barres obliques d'échappement.
Actuellement, je résous ce problème par String.Replacing les antislashs et la première et la dernière citation. Après cela, je suis capable de l'analyser.
mystring.Replace("\\", "");
Cependant, que se passe-t-il si l'un des attributs a réellement une barre oblique inverse comme valeur? Par exemple:
\"SecondAttribute\":\"My Super Back Slash: \\ . That was it.\"
Dans ce cas, je supprimerais accidentellement la barre oblique inverse qui devrait être là dans la valeur.
Quelqu'un at-il une idée brillante sur la façon d'analyser correctement cette chaîne JSON?
Il s'agit essentiellement d'un codage JSON as une chaîne JSON - après avoir trafiqué très légèrement la fin de votre chaîne, selon les commentaires. Ce n'est pas trop difficile à gérer dans Json.NET, en utilisant JToken.Parse
pour déséchapper efficacement en premier, puis en analysant le résultat:
using System;
using System.IO;
using Newtonsoft.Json.Linq;
class Program
{
static void Main(string[] args)
{
string text = File.ReadAllText("test.json");
JToken token = JToken.Parse(text);
JObject json = JObject.Parse((string) token);
Console.WriteLine(json);
}
}
Production:
{
"SomeResponse": {
"FIrstAttribute": 8,
"SecondAttribute": "On",
"ThirdAttribute": {
"Id": 2,
"FirstName": "Okkie",
"Name": "Bokkie",
"Street": "",
"StreetNumber": null,
"PostCode": "",
"City": "",
"Country": ""
}
}
}
Cela devrait être bien même avec des données contenant des barres obliques inverses, car je m'attends à ce que les barres obliques inversées soient à nouveau encodées - mais cela vaut la peine de vérifier à nouveau.
En utilisant Newtonsoft.Json, voici un exemple:
String json="{\"SomeResponse\":{\"FIrstAttribute\":8,\"SecondAttribute\":\"On\",\"ThirdAttribute\":{\"Id\":2,\"FirstName\":\"Okkie\",\"Name\":\"Bokkie\",\"Street\":\"\",\"StreetNumber\":null,\"PostCode\":\"\",\"City\":\"\",\"Country\":\"}}}";
dynamic result = JsonConvert.DeserializeObject(json);
Ugh ... ce n'est pas du tout JSON. C'est une imitation étrange de type JSON, mais assez méchante. Je pense que vous faites la bonne chose.
La seule chose que je pourrais faire est de faire l'opération de remplacement sur des paires de caractères plutôt que le seul caractère d'échappement:
myString.Replace(@"\""", @"""); // replace \" with "
Cela vous permettra de conserver en toute sécurité les caractères "\" imbriqués, de sorte que le JSON filtré ressemble à:
field_blah: "root\branch\sub-branch"
Je vous conseille vivement d'entreprendre un examen détaillé du texte "JSON" et de vous assurer qu'il s'agit de la seule séquence appariée dont vous devez vous soucier. Si vous avez d'autres paires, manipulez-les de la même manière que ci-dessus.