Convertir JObject dans Dictionnaire<string, object>. Est-il possible?
J'ai une web API méthode qui accepte un arbitraire de la charge utile json dans un JObject
de la propriété. En tant que tel je ne sais pas ce qui est à venir, mais j'ai encore besoin de la convertir .Types de réseau. Je voudrais avoir un Dictionary<string,object>
afin que je puisse traiter avec elle de toute façon je veux.
J'ai beaucoup cherché, mais impossible de trouver quoi que ce soit et il a fini par démarrer un désordre méthode pour faire cette conversion, touche par touche, valeur par valeur. Est-il un moyen facile de le faire?
Input ->
JObject person = new JObject(
new JProperty("Name", "John Smith"),
new JProperty("BirthDate", new DateTime(1983, 3, 20)),
new JProperty("Hobbies", new JArray("Play football", "Programming")),
new JProperty("Extra", new JObject(
new JProperty("Foo", 1),
new JProperty("Bar", new JArray(1, 2, 3))
)
)
Merci!
- De deux choses, JObject implémente déjà Dictionnaire<string, JToken>. Et à la question, quelle est votre intention de traiter avec des sous-propriétés. Serait-ce de la valeur dans votre Dictionnaire être un autre Dictionnaire<string, ?>?
- Oui @Riches, sous propriétés vont être un autre Dictionnaire<string, object>
- Voir aussi Comment dois-je utiliser JSON.NET pour désérialiser en imbriquée/récursive de Dictionnaire et la Liste?. Le
ToObject(JToken)
helper dans la première réponse permettra de faire la conversion avec un minimum de code.
Vous devez vous connecter pour publier un commentaire.
Si vous avez
JObject
les objets, les éléments suivants pourraient travailler:Si vous n'avez pas de
JObject
vous pouvez en créer un avec leNewtonsoft.Json.Linq
méthode d'extension:Sinon, cette réponse peut vous diriger dans la bonne direction, car il désérialise une chaîne JSON dans un Dictionnaire.
DeserializeObject<Dictionary<string, object>>
beaucoup travaillé pour moi; j'ai fini de le convertir à une gamme de dictionnaires pour mes besoins, viaDeserializeObject<Dictionary<string, object>[]>
.J'ai fini par utiliser un mélange des deux réponses que pas vraiment cloué.
ToObject() peut faire le premier niveau de propriétés dans un objet JSON, mais imbriquées les objets ne seront pas convertis au Dictionnaire().
Il ya aussi pas besoin de tout faire manuellement comme ToObject() est assez bonne, avec d'abord les propriétés de niveau.
Voici le code:
Cela pourrait avoir des cas où il ne fonctionne pas et la performance n'est pas la plus forte de la qualité de l'il.
Merci les gars!
JObject
) eux-mêmes ? Vous n'êtes pas convertir àDictionary<string,object>
JObject
s.JArrays
pourrait êtreJOBject
ouJArrray
, puis à ceux qui ont besoin d'être converti en C# array et C# Dictionnaire, dont le code ne fait pas.Voici le lancement de la version: j'ai modifié le code pour recurse JArrays un JObjects imbriquée dans JArrays/JObjects, qui l'a accepté la réponse n'est pas, comme l'a souligné @Nawaz.
Sonne comme un bon cas d'utilisation de méthodes d'extension - j'ai eu quelque chose qui traînent, qui a été assez simple de convertir Json.NET (Merci NuGet!):
Bien sûr, c'est rapidement mis ensemble, vous voulez les nettoyer, etc.
Ici est une version plus simple:
Si à l'aide de C# 7 on peut utiliser le pattern matching où il devrait ressembler à ceci: