json.net tiene método clave?

139

Si mi respuesta tiene "error" clave, necesito procesar el error y mostrar el cuadro de advertencia.

¿Existe el método "haskey" en json.net? Me gusta:

var x= JObject.Parse(string_my);
if(x.HasKey["error_msg"])
    MessageBox.Show("Error!")
Siete días
fuente
1
Por favor, consulte mi respuesta aquí .
Ben
Respondí una pregunta con un problema similar aquí: stackoverflow.com/a/47204235/1037314
Ben
1
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.

svick
fuente
37
¿Qué pasa si el valor de la propiedad es null?
Andreas Furster
67
@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:

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

... 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>.

Jon Skeet
fuente
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. JObject Ya se implementa IDictionary<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