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.