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!")
Sept jours
la source
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.

svick
la source
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.

Jon Skeet
la source
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