json.net ha il metodo chiave?


140

Se la mia risposta ha la chiave "errore", devo elaborare l'errore e mostrare la finestra di avviso.

Esiste un metodo "haskey" in json.net? Piace:

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

1
Si prega di fare riferimento alla mia risposta qui .
— Ben

Ho risposto a una domanda con un problema simile qui: stackoverflow.com/a/47204235/1037314
— Ben

1
Esistono due varianti di questa domanda: una variante è dove il dizionario JSON è piatto (senza figli) e un altro, dove la chiave è da qualche parte nella gerarchia dei bambini. Al momento della stesura di questo documento, ns.json non ha ancora alcun metodo pratico che consentirebbe di accedere facilmente al test di una chiave.
— ljgww,

Risposte:


241

Basta usare x["error_msg"]. Se la proprietà non esiste, restituisce null.


37
Cosa succede se il valore della proprietà è null?
— Andreas Furster

67
@AndreasFurster Quindi restituirà un JValuechi Valueè null, non solo null.
— svick

1
Se la proprietà potesse essere, nullè possibile utilizzare x["error_msg"] is Objectper verificare se la proprietà è definita nell'oggetto JSON
— stonito

2
@ user3199329 Questo è solo un modo confuso per scrivere x["error_msg"] != null, quindi no, non controlla che la proprietà esista e abbia il valore di null.
— svick

9
@ WilliamT.Mallard In C # 6, è possibile semplificare che utilizzando l'operatore di indice nullo-condizionale: myJObject["level1property"]?["level2property"].
— svick

98

JObjectimplementa IDictionary<string, JToken>, quindi puoi usare:

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

... o potresti usare TryGetValue. Implementa entrambi i metodi utilizzando l'implementazione esplicita dell'interfaccia, quindi non è possibile utilizzarli senza prima convertirsi in IDictionary<string, JToken>però.


Sottile che questa sarà lentamente la risposta accettata, ma grazie.
— SevenDays,

2
@wsevendays, la velocità conta per te qui o stai solo microottimizzando (e basandoti su ipotesi)? Dovresti usare ciò che ritieni più leggibile.
— svick,

La velocità del processore da 1 GHz del mio telefono WP7 non è eccezionale e devo preoccuparmi della velocità.
— SevenDays,

1
@wsevendays: Perché dovrebbe essere più lento (o più veloce) della risposta accettata?
— Jon Skeet,

24
@wsevenday: No, non crea un dizionario. JObject già implementa IDictionary<string, JToken> . Questo è solo un compito di riferimento. E no, la risposta accettata non sta controllando se la chiave è in un array ... sta ancora usando un normale indicizzatore. Solo perché sembra che l'accesso all'array non significhi che è l' accesso all'array. (L'accesso all'array non può essere in primo luogo tramite una stringa.)
— Jon Skeet,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.