Hay dos variantes de esta pregunta: una variante es donde el diccionario JSON es plano (sin elementos secundarios) y otro, donde la clave está en algún lugar de la jerarquía de elementos secundarios. Al momento de escribir esto, ns.json todavía no tiene un método conveniente que le permita acceder fácilmente para probar una clave.
ljgww
Respuestas:
239
Solo úsalo x["error_msg"]. Si la propiedad no existe, regresa null.
@AndreasFurster Entonces devolverá un de JValuequién Valuees null, no solo null.
svick
1
Si la propiedad pudiera ser null, podría usar x["error_msg"] is Objectpara verificar si la propiedad está definida en un objeto JSON
stonito
2
@ user3199329 Esa es solo una forma confusa de escribir x["error_msg"] != null, así que no, no comprueba que la propiedad existe y tiene el valor de null.
svick
9
@ WilliamT.Mallard En C # 6, se puede simplificar el que al utilizar el operador de índice nulo condicional: myJObject["level1property"]?["level2property"].
svick
98
JObjectimplementos IDictionary<string, JToken>, para que pueda usar:
... o podrías usarlo TryGetValue. Implementa ambos métodos usando una implementación de interfaz explícita, por lo que no puede usarlos sin antes convertirlos IDictionary<string, JToken>.
Creo que esto será lentamente, entonces la respuesta aceptada, pero gracias.
SevenDays
2
@wsevendays, ¿te importa la velocidad aquí o solo son microoptimizadoras (y basándote en conjeturas)? Debes usar lo que te parezca más legible.
svick
La velocidad del procesador de 1 GHz de mi teléfono WP7 no es excelente y necesito preocuparme por la velocidad.
SevenDays
1
@wsevendays: ¿Por qué sería más lento (o más rápido) que la respuesta aceptada?
Jon Skeet
24
@wsevenday: No, no crea un diccionario. JObjectYa se implementaIDictionary<string, JToken> . Esto es solo una asignación de referencia. Y no, la respuesta aceptada no es verificar si la clave está en una matriz ... todavía está usando un indexador normal. El hecho de que parezca acceso a la matriz no significa que sea acceso a la matriz. (El acceso a la matriz no puede ser por una cadena en primer lugar.)
Jon Skeet
11
JObject.ContainsKey(string propertyName) se ha hecho como método público en la versión 11.0.1
Respuestas:
Solo úsalo
x["error_msg"]
. Si la propiedad no existe, regresanull
.fuente
null
?JValue
quiénValue
esnull
, no solonull
.null
, podría usarx["error_msg"] is Object
para verificar si la propiedad está definida en un objeto JSONx["error_msg"] != null
, así que no, no comprueba que la propiedad existe y tiene el valor denull
.myJObject["level1property"]?["level2property"]
.JObject
implementosIDictionary<string, JToken>
, para que pueda usar:... o podrías usarlo
TryGetValue
. Implementa ambos métodos usando una implementación de interfaz explícita, por lo que no puede usarlos sin antes convertirlosIDictionary<string, JToken>
.fuente
JObject
Ya se implementaIDictionary<string, JToken>
. Esto es solo una asignación de referencia. Y no, la respuesta aceptada no es verificar si la clave está en una matriz ... todavía está usando un indexador normal. El hecho de que parezca acceso a la matriz no significa que sea acceso a la matriz. (El acceso a la matriz no puede ser por una cadena en primer lugar.)JObject.ContainsKey(string propertyName)
se ha hecho como método público en la versión 11.0.1Documentación: https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_ContainsKey.htm
fuente