json.net tiene un método clave?

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

¿Existe el método "haskey" en json.net? Igual que:

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

preguntado el 27 de agosto de 11 a las 19:08

Por favor refiérase a mi respuesta aquí. -

Respondí una pregunta con un problema similar aquí: stackoverflow.com/a/47204235/1037314 -

Hay dos variantes de esta pregunta: una variante es donde el diccionario JSON es plano (sin hijos) y otra, donde la clave está en algún lugar de la jerarquía de los hijos. En el momento de escribir esto, ns.json todavía no tiene un método conveniente que le dé fácil acceso para probar una clave. -

3 Respuestas

Sólo tiene que utilizar x["error_msg"]. Si la propiedad no existe, regresa null.

Respondido 27 ago 11, 23:08

¿Y si el valor de la propiedad es null? - Andreas Furster

@AndreasFurster Entonces devolverá un JValue cuyo Value is null, No sólo null. - svick

Si la propiedad pudiera ser null podrías usar x["error_msg"] is Object para verificar si la propiedad está definida en el objeto JSON - stonito

@ user3199329 Esa es solo una forma confusa de escribir x["error_msg"] != null, entonces no, no verifica que la propiedad exista y tenga el valor de null. - svick

@ WilliamT.Mallard En C # 6, puede simplificar eso usando el operador de índice condicional nulo: myJObject["level1property"]?["level2property"]. - svick

JObject implementos IDictionary<string, JToken>, para que pueda usar:

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

... o podrías usar TryGetValue. Implementa ambos métodos usando una implementación de interfaz explícita, por lo que no puede usarlos sin primero convertir a IDictionary<string, JToken> sin embargo.

Respondido 27 ago 11, 23:08

Creo que esta será lentamente la respuesta aceptada, pero gracias. - Siete días

@wsevendays, ¿la velocidad te importa aquí o solo estás microoptimizando (y basándote en conjeturas)? Debería utilizar lo que le resulte 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. - Siete días

@wsevendays: ¿Por qué sería más lento (o más rápido) que la respuesta aceptada? - Jon Skeet

@wsevenday: No, no es así Para crear un diccionario. JObject ya implementa IDictionary<string, JToken>. Es solo una tarea de referencia. Y no, la respuesta aceptada no es verificar si la clave está en un matriz... todavía está usando un indexador normal. Solo porque es miradas como el acceso a la matriz no significa eso is acceso a la matriz. (El acceso a la matriz no puede ser mediante una cadena en primer lugar). Jon Skeet

JObject.ContainsKey(string propertyName) se ha hecho como método público en la versión 11.0.1

Documentación - https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_ContainsKey.htm

Respondido 26 Oct 18, 23:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.