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!")

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.


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>.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.