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.
... 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. JObjectjuż wdrażaIDictionary<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,
11
JObject.ContainsKey(string propertyName) został udostępniony jako metoda publiczna w wersji 11.0.1
Odpowiedzi:
Po prostu użyj
x["error_msg"]
. Jeśli właściwość nie istnieje, zwracanull
.źródło
null
?JValue
czyjValue
jestnull
, a nie tylkonull
.null
możesz użyćx["error_msg"] is Object
do sprawdzenia, czy właściwość jest zdefiniowana w obiekcie JSONx["error_msg"] != null
, więc nie, nie sprawdza, czy właściwość istnieje i ma wartośćnull
.myJObject["level1property"]?["level2property"]
.JObject
narzędziaIDictionary<string, JToken>
, dzięki czemu możesz użyć:... 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 naIDictionary<string, JToken>
chociaż.źródło
JObject
już wdrażaIDictionary<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).JObject.ContainsKey(string propertyName)
został udostępniony jako metoda publiczna w wersji 11.0.1Dokumentacja - https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_ContainsKey.htm
źródło