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.
@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:
... 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. JObjectsudah mengimplementasikanIDictionary<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
11
JObject.ContainsKey(string propertyName) telah dibuat sebagai metode publik dalam rilis 11.0.1
Jawaban:
Gunakan saja
x["error_msg"]
. Jika properti tidak ada, ia kembalinull
.sumber
null
?JValue
yangValue
adalahnull
, bukan hanyanull
.null
Anda dapat gunakanx["error_msg"] is Object
untuk memeriksa apakah properti didefinisikan dalam objek JSONx["error_msg"] != null
, jadi tidak, itu tidak memeriksa bahwa properti itu ada dan memiliki nilainull
.myJObject["level1property"]?["level2property"]
.JObject
mengimplementasikanIDictionary<string, JToken>
, sehingga Anda dapat menggunakan:... atau Anda bisa menggunakan
TryGetValue
. Ini mengimplementasikan kedua metode menggunakan implementasi antarmuka eksplisit, jadi Anda tidak dapat menggunakannya tanpa terlebih dahulu mengkonversiIDictionary<string, JToken>
.sumber
JObject
sudah mengimplementasikanIDictionary<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.)JObject.ContainsKey(string propertyName)
telah dibuat sebagai metode publik dalam rilis 11.0.1Dokumentasi - https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_ContainsKey.htm
sumber