json.net punya metode kunci?

139

Jika respons saya memiliki "kesalahan" kunci, saya perlu memproses kesalahan dan menampilkan kotak peringatan.

Apakah ada metode "haskey" di json.net? Suka:

var x= JObject.Parse(string_my);
if(x.HasKey["error_msg"])
    MessageBox.Show("Error!")
Tujuh hari
sumber
1
Silakan merujuk jawaban saya di sini .
Ben
Saya menjawab pertanyaan dengan masalah serupa di sini: stackoverflow.com/a/47204235/1037314
Ben
1
Ada dua varian dari pertanyaan ini: Satu varian adalah di mana kamus JSON datar (tidak ada anak-anak) dan lainnya, di mana kunci ada di suatu tempat dalam hierarki anak-anak. Pada saat penulisan ini, ns.json masih belum memiliki metode kenyamanan yang akan memberikan akses mudah untuk menguji kunci.
ljgww

Jawaban:

239

Gunakan saja x["error_msg"]. Jika properti tidak ada, ia kembali null.

svick
sumber
37
Bagaimana jika nilai properti itu null?
Andreas Furster
67
@AndreasFurster Maka akan mengembalikan JValueyang Valueadalah null, bukan hanya null.
svick
1
Jika properti itu bisa nullAnda dapat gunakan x["error_msg"] is Objectuntuk memeriksa apakah properti didefinisikan dalam objek JSON
stonito
2
@ user3199329 Itu hanya cara yang membingungkan untuk menulis x["error_msg"] != null, jadi tidak, itu tidak memeriksa bahwa properti itu ada dan memiliki nilai null.
svick
9
@ WilliamT.Mallard Dalam C # 6, Anda dapat menyederhanakan bahwa dengan menggunakan operator indeks nol-kondisional: myJObject["level1property"]?["level2property"].
svick
98

JObjectmengimplementasikan IDictionary<string, JToken>, sehingga Anda dapat menggunakan:

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

... atau Anda bisa menggunakan TryGetValue. Ini mengimplementasikan kedua metode menggunakan implementasi antarmuka eksplisit, jadi Anda tidak dapat menggunakannya tanpa terlebih dahulu mengkonversi IDictionary<string, JToken>.

Jon Skeet
sumber
Saya pikir ini akan secara perlahan maka jawaban yang diterima, tapi terima kasih.
SevenDays
2
@wsevendays, apakah kecepatan penting bagi Anda di sini atau hanya mengoptimalkan mikro (dan mendasarkannya pada tebakan)? Anda harus menggunakan apa yang Anda temukan lebih mudah dibaca.
svick
Kecepatan prosesor 1GHz pada ponsel WP7 saya tidak terlalu bagus dan saya perlu memperhatikan kecepatannya.
SevenDays
1
@wsevendays: Mengapa lebih lambat (atau lebih cepat) daripada jawaban yang diterima?
Jon Skeet
24
@wsevenday: Tidak, itu tidak membuat kamus. JObject sudah mengimplementasikan IDictionary<string, JToken> . Ini hanya tugas referensi. Dan tidak, jawaban yang diterima tidak memeriksa apakah kunci dalam array ... masih menggunakan pengindeks normal. Hanya karena terlihat seperti akses array tidak berarti itu adalah akses array. (Akses array tidak dapat dilakukan dengan string di tempat pertama.)
Jon Skeet