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!")

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.


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ż.


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,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.