json.net имеет ключевой метод?

Если в моем ответе есть ключ «ошибка», мне нужно обработать ошибку и показать окно с предупреждением.

Существует ли в json.net метод haskey? Нравиться:

var x= JObject.Parse(string_my);
if(x.HasKey["error_msg"])
    MessageBox.Show("Error!")

person SevenDays    schedule 27.08.2011    source источник
comment
См. Мой ответ здесь.   -  person Ben    schedule 09.11.2017
comment
Я ответил на вопрос с аналогичной проблемой здесь: stackoverflow.com/a/47204235/1037314   -  person Ben    schedule 09.11.2017
comment
Есть два варианта этого вопроса: один вариант, когда словарь JSON является плоским (без дочерних элементов), а другой, где ключ находится где-то в иерархии дочерних элементов. На момент написания этой статьи у ns.json еще не было удобного метода, который давал бы легкий доступ для проверки ключа.   -  person ljgww    schedule 19.02.2018


Ответы (3)


Просто используйте x["error_msg"]. Если свойство не существует, возвращается null.

person svick    schedule 27.08.2011
comment
Что, если значение свойства равно null? - person Andreas Furster; 04.03.2015
comment
@AndreasFurster Затем он вернет JValue, Value которого null, а не только null. - person svick; 04.03.2015
comment
Если свойство может быть null, вы можете использовать x["error_msg"] is Object, чтобы проверить, определено ли свойство в объекте JSON. - person stonito; 15.11.2016
comment
@ user3199329 Это просто запутанный способ записи x["error_msg"] != null, поэтому нет, он не проверяет, существует ли свойство и имеет значение null. - person svick; 15.11.2016
comment
Имейте в виду, что если вы проверяете наличие вложенного токена, вам необходимо проверять каждый уровень отдельно. Например, myJObject["level1property"]["level2property"] с throw, если level1property не существует. Вы должны сначала проверить myJObject["level1property"]. - person William T. Mallard; 04.01.2017
comment
@ WilliamT.Mallard В C # 6 это можно упростить, используя оператор условного индекса со значением NULL: myJObject["level1property"]?["level2property"]. - person svick; 04.01.2017
comment
@svick Спасибо! Я полагаю, что в какой-то момент вы сможете поставить вопросительный знак практически в любом месте вашего кода. :) - person William T. Mallard; 04.01.2017
comment
это даст исключение «System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта». если error_msg отсутствует в x - person TejpalBh; 22.06.2019

JObject реализует IDictionary<string, JToken>, поэтому вы можете использовать:

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

... или вы можете использовать TryGetValue. Он реализует оба метода с использованием явной реализации интерфейса, поэтому вы не можете использовать их без предварительного преобразования в IDictionary<string, JToken>.

person Jon Skeet    schedule 27.08.2011
comment
Я думаю, что это будет медленно, чем принятый ответ, но спасибо. - person SevenDays; 28.08.2011
comment
@wsevendays, скорость имеет значение для вас здесь или вы просто микрооптимизируете (и основываете это на догадках)? Вы должны использовать то, что считаете более читаемым. - person svick; 28.08.2011
comment
Скорость процессора 1 ГГц моего телефона WP7 невелика, и мне нужно заботиться о скорости. - person SevenDays; 28.08.2011
comment
@wsevendays: Почему он будет медленнее (или быстрее), чем принятый ответ? - person Jon Skeet; 28.08.2011
comment
Ваш метод создает словарь, он будет медленнее с самого начала. Метод принятого ответа только проверяет, находится ли ключ в массиве. - person SevenDays; 29.08.2011
comment
@wsevenday: Нет, он не создает словарь. JObject уже реализует IDictionary<string, JToken>. Это просто справочное задание. И нет, принятый ответ не проверяет, находится ли ключ в массиве ... он все еще использует обычный индексатор. То, что это выглядит как доступ к массиву, не означает, что это есть доступ к массиву. (Доступ к массиву не может быть в первую очередь строковым.) - person Jon Skeet; 29.08.2011
comment
Вызов метода через абстрактный интерфейс, такой как IDictionary, происходит медленнее, чем вызов через открытый интерфейс, но мы говорим о смехотворно малом количестве. - person Jonathan Allen; 07.01.2017

JObject.ContainsKey(string propertyName) был сделан как общедоступный метод в выпуске 11.0.1

Документация - https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_ContainsKey.htm

person Razor    schedule 26.10.2018