La désérialisation JSON à l'aide de JSon.NET avec des données dynamiques
Je suis en train de désérialiser certaines données JSON dans les objets d'une application. Jusqu'à présent il a été très bien parce que les propriétés sur les données JSON était statique (clé avec une valeur). Maintenant, j'ai eu un résultat où la clé est une dynamique morceau de données.
Voici un exemple JSON url:
http://en.wikipedia.org/w/api.php?action=query&format=json&pageids=6695&prop=info
L'résultant JSON est la suivante:
{ "query" : { "pages" : { "6695" : { "counter" : "",
"lastrevid" : 468683764,
"length" : 8899,
"ns" : 0,
"pageid" : 6695,
"title" : "Citadel",
"touched" : "2012-01-03T19:16:16Z"
} } } }
Ok, c'est génial, sauf que je ne peux pas désérialiser les "pages" de données dans un objet. Si je devais définir une classe pour les pages, il devra ressembler à ceci:
public class 6695
{
public string counter { get; set; }
public int lastrevid { get; set; }
public int length { get; set; }
public int ns { get; set; }
public int pageid { get; set; }
public string title { get; set; }
public string touched { get; set; }
}
Pour deserialze le contenu (à l'aide de JsonConvert.Deserialize(jsondata)) et nous savons tous que nous ne pouvons pas avoir une classe appelée 6695. Non seulement cela, le nom de la classe devrait être différente (par exemple pageid=7145 serait le 7145 classe).
Je peux paraître arracher certaines valeurs si j'utilise quelque chose comme JObject.Parse(contenu) et ensuite accéder aux éléments comme JArrays mais c'est assez moche et je suis toujours coincé à essayer de sortir les données à partir des pages de tableau.
La recherche de quelqu'un pour aider avec ceci. Je ne pense pas que c'est rare, c'est juste pas de données JSON que j'ai rencontré avant et ne savez pas comment le gérer.
Merci!
PS j'ai oublié de mentionner c'est que sur Windows Phone 7, de manière "dynamique" n'est pas disponible!
- Ne serait pas le 6695, juste être nom de la propriété, plutôt que d'un nom de classe? Encore un problème, mais peut-être vous pouvez faire la recherche et de remplacement de la propriété numérique dans certains nom fixe. Je ne suis pas sûr de savoir comment Json.NET poignées de cela, mais peut-être que vous pouvez essayer de le désérialiser un dictionnaire d'un type d'objet spécifique?
- Je suis sans doute un peu tard pour cette partie, mais le newtonsoft lib a JObject pour cette ... var obj = JObject.Parse(jsonString); essentiellement traite les données comme un complexe imbriquée dictionnaire similaire à la façon dont javascript se comporte dans le navigateur. Vous obtenez en retour une instance d'un "JObject" qui vous permet d'accéder à tout en utilisant la syntaxe de tableau par exemple: var page = obj["page"]["6695"]
Vous devez vous connecter pour publier un commentaire.
Voici comment vous le faites à l'aide de https://github.com/facebook-csharp-sdk/simple-json ( https://nuget.org/packages/SimpleJson ).
(À l'aide de dynamic)
(À l'aide de classes fortement typées)
[Mise à jour]
sur windows phone où la dynamique n'est pas pris en charge et vous ne voulez pas utiliser des classes fortement typées.
La méthode la plus simple. Dans ce cas particulier serait probablement aller
dynamic
.Vous pouvez faire référence à n'importe quel élément en c'est
[]
nom de sorte que vous pouvez faire quelque chose commedata["query"]["pages"]["6695"]["lastrevid"]
. Cela permet d'obtenir par tous ces petits objets dont le nom n'est pas valide en c#.dynamic data = JsonConvert.DeserializeObject(json);
J'espère que l'exemple ci-dessous va vous aider.
J'ai toujours la conception d'un modèle qui correspondent le json. Il est beaucoup mieux de travailler avec l'objet lorsqu'il est de votre propre modèle de conception.
Il est très facile de générer le modèle c# à partir du json. J'utilise ce site pour générer le modèle: http://json2csharp.com
Un exemple complet est:
De Code C#:
JSON:
Modèle:
À l'aide de Json.net il vous suffit de faire:
Comment un simple rechercher et remplacer dans la chaîne JSON ? Alors qu'il pourrait ne pas être la solution la plus élégante, il serait peut-être le plus pragmatique.
Peut-être vous pouvez simplement utiliser un attribut réservé à contenir le type d'objet, puis utilisez le type de base, comme indiqué dans cet article: Les types de dynamiques avec JSON.NET