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

142

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

Существует ли в json.net метод haskey? Подобно:

var x= JObject.Parse(string_my);
if(x.HasKey["error_msg"])
    MessageBox.Show("Error!")
Семь дней
источник
1
Пожалуйста, обратитесь к моему ответу здесь .
Бен
Я ответил на вопрос с аналогичной проблемой здесь: stackoverflow.com/a/47204235/1037314
Бен,
1
Есть два варианта этого вопроса: один вариант, когда словарь JSON является плоским (без дочерних элементов), а другой, где ключ находится где-то в иерархии дочерних элементов. На момент написания этой статьи у ns.json все еще не было удобного метода, который давал бы легкий доступ для проверки ключа.
ljgww

Ответы:

245

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

Свик
источник
37
Что делать, если стоимость имущества равна null?
Андреас Фёрстер,
67
@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> . Это просто справочное задание. И нет, принятый ответ не проверяет, находится ли ключ в массиве ... он все еще использует обычный индексатор. То, что это выглядит как доступ к массиву, не означает, что это доступ к массиву. (Доступ к массиву не может осуществляться по строке.)
Джон Скит,