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.
@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:
... 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. JObjectmet déjà en œuvreIDictionary<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
11
JObject.ContainsKey(string propertyName) a été faite comme méthode publique dans la version 11.0.1
Réponses:
Utilisez simplement
x["error_msg"]
. Si la propriété n'existe pas, elle retournenull
.la source
null
?JValue
dontValue
estnull
, pas seulementnull
.null
vous pouvez l'utiliserx["error_msg"] is Object
pour vérifier si la propriété est définie dans l'objet JSONx["error_msg"] != null
, donc non, cela ne vérifie pas que la propriété existe et a la valeur denull
.myJObject["level1property"]?["level2property"]
.JObject
implémentesIDictionary<string, JToken>
, vous pouvez donc utiliser:... 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 enIDictionary<string, JToken>
cependant.la source
JObject
met déjà en œuvreIDictionary<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.)JObject.ContainsKey(string propertyName)
a été faite comme méthode publique dans la version 11.0.1Documentation - https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_ContainsKey.htm
la source