Есть два варианта этого вопроса: один вариант, когда словарь JSON является плоским (без дочерних элементов), а другой, где ключ находится где-то в иерархии дочерних элементов. На момент написания этой статьи у ns.json все еще не было удобного метода, который давал бы легкий доступ для проверки ключа.
ljgww
Ответы:
245
Просто используйте x["error_msg"]. Если свойство не существует, оно возвращается null.
@AndreasFurster Тогда он будет возвращать JValueчье Valueэто nullне просто null.
svick 04
2
Если бы свойство могло быть nullиспользовано, x["error_msg"] is Objectчтобы проверить, определено ли свойство в объекте JSON
stonito
2
@ user3199329 Это просто запутанный способ записи x["error_msg"] != null, поэтому нет, он не проверяет, существует ли свойство и имеет значение null.
svick
9
@ WilliamT.Mallard В C # 6, можно упростить , что с помощью нуль-условный оператор индекса: myJObject["level1property"]?["level2property"].
svick
101
JObjectинвентарь IDictionary<string, JToken>, поэтому вы можете использовать:
IDictionary<string, JToken> dictionary = x;
if (dictionary.ContainsKey("error_msg"))
... или вы могли бы использовать TryGetValue. Он реализует оба метода с использованием явной реализации интерфейса, поэтому вы не можете использовать их без предварительного преобразования в IDictionary<string, JToken>.
Я думаю, что это будет медленно, чем принятый ответ, но спасибо.
SevenDays,
2
@wsevendays, скорость имеет значение для вас здесь или вы просто микрооптимизируете (и основываете это на догадках)? Вы должны использовать то, что считаете более читаемым.
svick
Скорость процессора 1 ГГц моего телефона WP7 невелика, и мне нужно заботиться о скорости.
SevenDays,
1
@wsevendays: Почему он будет медленнее (или быстрее), чем принятый ответ?
Джон Скит
24
@wsevenday: Нет, он не создает словарь. JObjectуже реализуетIDictionary<string, JToken> . Это просто справочное задание. И нет, принятый ответ не проверяет, находится ли ключ в массиве ... он все еще использует обычный индексатор. То, что это выглядит как доступ к массиву, не означает, что это доступ к массиву. (Доступ к массиву не может осуществляться по строке.)
Джон Скит,
12
JObject.ContainsKey(string propertyName) был сделан как общедоступный метод в выпуске 11.0.1
Ответы:
Просто используйте
x["error_msg"]
. Если свойство не существует, оно возвращаетсяnull
.источник
null
?JValue
чьеValue
этоnull
не простоnull
.null
использовано,x["error_msg"] is Object
чтобы проверить, определено ли свойство в объекте JSONx["error_msg"] != null
, поэтому нет, он не проверяет, существует ли свойство и имеет значениеnull
.myJObject["level1property"]?["level2property"]
.JObject
инвентарьIDictionary<string, JToken>
, поэтому вы можете использовать:IDictionary<string, JToken> dictionary = x; if (dictionary.ContainsKey("error_msg"))
... или вы могли бы использовать
TryGetValue
. Он реализует оба метода с использованием явной реализации интерфейса, поэтому вы не можете использовать их без предварительного преобразования вIDictionary<string, JToken>
.источник
JObject
уже реализуетIDictionary<string, JToken>
. Это просто справочное задание. И нет, принятый ответ не проверяет, находится ли ключ в массиве ... он все еще использует обычный индексатор. То, что это выглядит как доступ к массиву, не означает, что это доступ к массиву. (Доступ к массиву не может осуществляться по строке.)JObject.ContainsKey(string propertyName)
был сделан как общедоступный метод в выпуске 11.0.1Документация - https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_ContainsKey.htm
источник