Désérialiser C # dynamic JSON

J’ai la chaîne Json suivante que je dois désérialiser.

{"123456789": {"short_description":"Delivered", "detail_description":"Your item has been delivered" } } 

Le premier champ “123456789” est un numéro d’identification. Cette valeur peut donc être différente en fonction des données interrogées.

J’utilise C # dans Visual Studio. Évidemment, parce que la valeur du premier champ peut changer, je ne peux pas utiliser de classe prédéfinie pour désérialiser le JSON, car ce champ sera utilisé comme nom de classe, mais sa valeur ne correspond pas à celui de la classe.

Existe-t-il un moyen de désérialiser cela en une sorte de classe dynamic tout en accédant aux champs comme s’il s’agissait d’une classe prédéfinie?

Sinon, existe-t-il un moyen de désérialiser cela dans une classe prédéfinie même si le nom de la classe ne correspond pas?

Le service fournissant ces données est une tierce partie, donc je n’ai aucun contrôle sur ces données.

    Voici un moyen que j’utilise dans le code de production. Ce n’est peut-être pas parfait, mais le travail est fait.

     using using System.Web.Script.Serialization; // ..... public object GetJson(ssortingng url) { var json = Get(url); // I have code that makes this work, it gets a JSON ssortingng try { var deserializer = new JavaScriptSerializer(); var result = deserializer.DeserializeObject(json); return result; } catch (ArgumentException e) { // Error handling.... } } 

    L’object que vous recevrez en retour sera une carte générique, une liste ou quoi que ce soit en fonction de la structure du JSON. Si vous savez à quoi vous attendre, cela est très utile sans écrire un parsingur personnalisé ou un type d’object cible.

    Vous pouvez ensuite énumérer les clés de la carte, par exemple, pour trouver votre clé qui varie. Un wrapper ou une conversion fournirait alors une API cohérente au rest de votre couche d’application. Quelque chose comme:

     public class Order { public ssortingng OrderNum { private set; get; } public ssortingng ShortDesc { private set; get; } public ssortingng Desc { private set; get; } public static Order FromJson(object jsonResult) { var m = jsonResult as Map; // Handle errors, but I am not var firstPair = m.First(); var detail = firstPair.Value as Map; var dummy = new Order() { OrderNum = firstPair.Key, ShortDesc = detail["short_description"].ToSsortingng(); Desc = detail["detail_description"].ToSsortingng(); } return dummy; } } 

    J’ai aimé la réponse ci-dessus alors je l’ai refactorisé un peu. Vous aurez besoin de références à System.Web.Extensions.dll et System.Web.Script.Serialization .

    Voici la classe:

     public class Order { public ssortingng OrderNum { private set; get; } public ssortingng ShortDesc { private set; get; } public ssortingng Desc { private set; get; } public static Order FromJson(ssortingng jsonResult) { JavaScriptSerializer js = new JavaScriptSerializer(); // Should deserialize right to Dictionary // var result = ((Dictionary)js.Deserialize(jsonResult)).First(); var result = js.Deserialize>(jsonResult).First(); var detail = (Dictionary)result.Value; return new Order() { OrderNum = result.Key, ShortDesc = detail["short_description"].ToSsortingng(), Desc = detail["detail_description"].ToSsortingng() }; } } 

    Et comment l’appeler:

     ssortingng json = "{\"123456789\": {\"short_description\":\"Delivered\", \"detail_description\":\"Your item has been delivered\" } }"; Order o = Order.FromJson(json); 

    Vous devrez toutefois implémenter vous-même la gestion des erreurs.