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


140

Якщо у моїй відповіді є клавіша "помилка", мені потрібно обробити помилку та показати поле попередження.

Чи існує метод "haskey" на json.net? Подібно до:

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

Відповіді:


240

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


37
Що робити, якщо вартість майна null?
Андреас Фурстер

67
@AndreasFurster Тоді він поверне JValueчиє Valueє null, а не просто null.
svick

1
Якщо власність може бути, 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

98

JObjectІнструменти IDictionary<string, JToken>, тож ви можете використовувати:

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

... або ви могли використовувати TryGetValue. Він реалізує обидва способи, використовуючи явну реалізацію інтерфейсу, тому ви не можете їх використовувати без попереднього перетворення в IDictionary<string, JToken>хоч.


Я тонко кажу це буде повільно, то прийнята відповідь, але дякую.
Сім днів

2
@wsevendays, чи важлива тут швидкість для вас або просто мікрооптимізується (і базується на здогадах)? Вам слід використовувати те, що вам зручніше читати.
svick

Швидкість процесора 1 ГГц мого телефону WP7 не велика, і про швидкість мені потрібно дбати.
Сім днів

1
@wsevendays: Чому це було б повільніше (або швидше), ніж прийнята відповідь?
Джон Скіт

24
@wsevenday: Ні, це не створює словник. JObject вже реалізує IDictionary<string, JToken> . Це лише довідкове завдання. І ні, прийнята відповідь не перевіряє, чи є ключ у масиві ... він все ще використовує звичайний індексатор. Тільки тому, що він схожий на доступ до масиву, не означає, що це доступ до масиву. (Доступ до масиву в першу чергу не може бути за допомогою рядка.)
Джон Скіт

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.