json.net a une méthode clé?


140

Si ma réponse a la clé "erreur", je dois traiter l'erreur et afficher la boîte d'avertissement.

Existe-t-il une méthode "haskey" dans json.net? Comme:

var x= JObject.Parse(string_my);
if(x.HasKey["error_msg"])
    MessageBox.Show("Error!")

1
Veuillez vous référer à ma réponse ici .
Ben

J'ai répondu à une question avec un problème similaire ici: stackoverflow.com/a/47204235/1037314
Ben

1
Il existe deux variantes de cette question: une variante est où le dictionnaire JSON est plat (pas d'enfants) et une autre, où la clé est quelque part dans la hiérarchie des enfants. Au moment d'écrire ces lignes, ns.json n'a toujours pas de méthode pratique qui donnerait un accès facile pour tester une clé.
ljgww

Réponses:


241

Utilisez simplement x["error_msg"]. Si la propriété n'existe pas, elle retourne null.


37
Et si la valeur de la propriété est null?
Andreas Furster

67
@AndreasFurster Ensuite, il renverra un JValuedont Valueest null, pas seulement null.
svick

1
Si la propriété peut être, nullvous pouvez l'utiliser x["error_msg"] is Objectpour vérifier si la propriété est définie dans l'objet JSON
stonito

2
@ user3199329 C'est juste une manière déroutante d'écrire x["error_msg"] != null, donc non, cela ne vérifie pas que la propriété existe et a la valeur de null.
svick

9
@ WilliamT.Mallard En C # 6, vous pouvez simplifier qu'en utilisant l'opérateur d'index nul conditionnel: myJObject["level1property"]?["level2property"].
svick

98

JObjectimplémentes IDictionary<string, JToken>, vous pouvez donc utiliser:

IDictionary<string, JToken> dictionary = x;
if (dictionary.ContainsKey("error_msg"))

... ou vous pourriez utiliser TryGetValue. Il implémente les deux méthodes en utilisant une implémentation d'interface explicite, vous ne pouvez donc pas les utiliser sans d'abord les convertir en IDictionary<string, JToken>cependant.


Je pense que ce sera lentement la réponse acceptée, mais merci.
SevenDays

2
@wsevendays, la vitesse compte-t-elle pour vous ici ou est-elle simplement une micro-optimisation (et basée sur des suppositions)? Vous devriez utiliser ce que vous trouvez plus lisible.
svick

La vitesse du processeur 1 GHz de mon téléphone WP7 n'est pas excellente et je dois me soucier de la vitesse.
SevenDays

1
@wsevendays: Pourquoi serait-ce plus lent (ou plus rapide) que la réponse acceptée?
Jon Skeet

24
@wsevenday: Non, cela ne crée pas de dictionnaire. JObject met déjà en œuvre IDictionary<string, JToken> . Ceci est juste une affectation de référence. Et non, la réponse acceptée ne vérifie pas si la clé est dans un tableau ... elle utilise toujours un indexeur normal. Ce n'est pas parce que cela ressemble à un accès au tableau qu'il s'agit d'un accès au tableau. (L'accès au tableau ne peut pas se faire par une chaîne en premier lieu.)
Jon Skeet

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.