json.net ma metodę klucza?

140

Jeśli moja odpowiedź zawiera klucz „błąd”, muszę przetworzyć błąd i wyświetlić okno ostrzegawcze.

Czy istnieje metoda „haskey” w json.net? Lubić:

var x= JObject.Parse(string_my);
if(x.HasKey["error_msg"])
    MessageBox.Show("Error!")
Siedem dni
źródło
1
Proszę zapoznać się z moją odpowiedzią tutaj .
Ben
Odpowiedziałem na pytanie z podobnym problemem tutaj: stackoverflow.com/a/47204235/1037314
Ben
1
Istnieją dwa warianty tego pytania: jeden wariant to taki, w którym słownik JSON jest płaski (bez dzieci), a drugi, w którym klucz jest gdzieś w hierarchii dzieci. W chwili pisania tego tekstu ns.json nadal nie ma wygodnej metody, która zapewniłaby łatwy dostęp do testowania klucza.
ljgww

Odpowiedzi:

240

Po prostu użyj x["error_msg"]. Jeśli właściwość nie istnieje, zwraca null.

svick
źródło
37
A jeśli wartość nieruchomości wynosi null?
Andreas Furster
67
@AndreasFurster Wtedy zwróci JValueczyj Valuejest null, a nie tylko null.
svick
1
Jeśli właściwość mogłaby być, nullmożesz użyć x["error_msg"] is Objectdo sprawdzenia, czy właściwość jest zdefiniowana w obiekcie JSON
stonito
2
@ user3199329 To tylko mylący sposób pisania x["error_msg"] != null, więc nie, nie sprawdza, czy właściwość istnieje i ma wartość null.
svick
9
@ WilliamT.Mallard W języku C # 6, można uprościć, że za pomocą operatora indeksu null warunkowe: myJObject["level1property"]?["level2property"].
Svick
98

JObjectnarzędzia IDictionary<string, JToken>, dzięki czemu możesz użyć:

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

... lub możesz użyć TryGetValue. Implementuje obie metody przy użyciu jawnej implementacji interfejsu, więc nie możesz ich używać bez uprzedniej konwersji na IDictionary<string, JToken>chociaż.

Jon Skeet
źródło
Myślę, że to będzie powoli wtedy akceptowana odpowiedź, ale dzięki.
SevenDays
2
@wsevendays, czy szybkość ma dla Ciebie znaczenie, czy po prostu mikrooptymalizujesz (i opierasz się na domysłach)? Powinieneś użyć tego, co uważasz za bardziej czytelne.
svick
Szybkość procesora 1GHz mojego telefonu WP7 nie jest świetna i muszę dbać o szybkość.
SevenDays
1
@wsevendays: Dlaczego miałoby to być wolniejsze (lub szybsze) niż zaakceptowana odpowiedź?
Jon Skeet
24
@wsevenday: Nie, to nie tworzy słownika. JObject już wdraża IDictionary<string, JToken> . To jest tylko przypisanie referencyjne. I nie, zaakceptowana odpowiedź nie oznacza sprawdzenia, czy klucz znajduje się w tablicy ... nadal używa normalnego indeksatora. To, że wygląda na dostęp do tablicy, nie oznacza, że jest to dostęp do tablicy. (Dostęp do tablicy nie może odbywać się za pomocą ciągu znaków w pierwszej kolejności).
Jon Skeet,