json.net hat Schlüsselmethode?

139

Wenn meine Antwort den Schlüssel "Fehler" enthält, muss ich den Fehler verarbeiten und das Warnfeld anzeigen.

Gibt es eine "haskey" -Methode in json.net? Mögen:

var x= JObject.Parse(string_my);
if(x.HasKey["error_msg"])
    MessageBox.Show("Error!")
Sieben Tage
quelle
1
Bitte lesen Sie meine Antwort hier .
Ben
Ich beantwortete eine Frage mit ähnlichem Problem hier: stackoverflow.com/a/47204235/1037314
Ben
1
Es gibt zwei Varianten dieser Frage: In einer Variante ist das JSON-Wörterbuch flach (keine Kinder) und in einer anderen befindet sich der Schlüssel irgendwo in der Hierarchie der Kinder. Zum Zeitpunkt des Schreibens hat ns.json noch keine bequeme Methode, die einen einfachen Zugriff zum Testen eines Schlüssels ermöglichen würde.
ljgww

Antworten:

239

Einfach benutzen x["error_msg"]. Wenn die Eigenschaft nicht vorhanden ist, wird sie zurückgegeben null.

svick
quelle
37
Was ist, wenn der Wert der Immobilie ist null?
Andreas Furster
67
@AndreasFurster Dann wird es eine Rückkehr JValuedessen Valueist null, nicht nur null.
Svick
1
Wenn die Eigenschaft sein könnte, könnten nullSie verwenden x["error_msg"] is Object, um zu überprüfen, ob die Eigenschaft im JSON-Objekt definiert ist
stonito
2
@ user3199329 Das ist nur eine verwirrende Art zu schreiben x["error_msg"] != null. Nein, es wird nicht überprüft, ob die Eigenschaft vorhanden ist und den Wert von hat null.
Svick
9
@ WilliamT.Mallard In C # 6 können Sie dies vereinfachen, indem Sie den nullbedingten Indexoperator verwenden : myJObject["level1property"]?["level2property"].
Svick
98

JObjectimplementiert IDictionary<string, JToken>, so dass Sie verwenden können:

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

... oder du könntest verwenden TryGetValue. Beide Methoden werden mithilfe einer expliziten Schnittstellenimplementierung implementiert, sodass Sie sie nicht verwenden können, ohne sie zuvor zu konvertieren IDictionary<string, JToken>.

Jon Skeet
quelle
Ich denke das wird langsam dann die akzeptierte Antwort sein, aber danke.
SevenDays
2
@wsevendays, spielt Geschwindigkeit für Sie hier eine Rolle oder ist nur eine Mikrooptimierung (und basiert auf Vermutungen)? Sie sollten das verwenden, was Sie besser lesbar finden.
Svick
Die Geschwindigkeit des 1-GHz-Prozessors meines WP7-Telefons ist nicht großartig und ich muss mich um die Geschwindigkeit kümmern.
SevenDays
1
@wsevendays: Warum sollte es langsamer (oder schneller) sein als die akzeptierte Antwort?
Jon Skeet
24
@wsevenday: Nein, ist es nicht schafft ein Wörterbuch. JObject implementiert bereits IDictionary<string, JToken> . Dies ist nur eine Referenzaufgabe. Und nein, die akzeptierte Antwort prüft nicht, ob sich der Schlüssel in einem Array befindet . Es wird immer noch ein normaler Indexer verwendet. Nur weil es so aussieht, als wäre es ein Array-Zugriff, heißt das nicht, dass es sich um einen Array-Zugriff handelt. (Array-Zugriff kann nicht über eine Zeichenfolge erfolgen.)
Jon Skeet