json.net'in anahtar yöntemi var mı?


140

Cevabımda anahtar "hata" varsa, hatayı işlemem ve uyarı kutusunu göstermem gerekiyor.

Json.net'te "haskey" yöntemi var mı? Sevmek:

var x= JObject.Parse(string_my);
if(x.HasKey["error_msg"])
    MessageBox.Show("Error!")

1
Lütfen cevabımı buraya bakın .
Ben

Burada benzer sorunla ilgili bir soruyu cevapladım: stackoverflow.com/a/47204235/1037314
Ben

1
Bu sorunun iki çeşidi vardır: Bir varyant JSON sözlüğünün düz (çocuksuz), diğeri ise anahtarın çocuk hiyerarşisinde bir yer olmasıdır. Bunu yazarken, ns.json'un bir anahtarı test etmeyi kolaylaştıracak kolaylık yöntemi yoktur.
ljgww

Yanıtlar:


240

Sadece kullan x["error_msg"]. Özellik yoksa, geri döner null.


37
Mülkün değeri ne olacak null?
Andreas Furster

67
@AndreasFurster Sonra bir dönecektir JValuekimin Valueolduğunu null, sadece null.
svick

1
Özellik olabilirse , özelliğin JSON nesnesinde tanımlanıp tanımlanmadığını kontrol etmek için nullkullanabilirsinizx["error_msg"] is Object
stonito

2
@ user3199329 Bu yazmak için sadece kafa karıştırıcı bir yol x["error_msg"] != null, bu nedenle hayır, özelliğin var olup olmadığını ve değerinin olup olmadığını kontrol etmez null.
svick

9
WilliamT.Mallard C # b 6, null-şartlı indeks operatörü kullanarak bu kolaylaştırabilirsiniz: myJObject["level1property"]?["level2property"].
svick

98

JObjectuygular IDictionary<string, JToken>, böylece şunları kullanabilirsiniz:

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

... ya da kullanabilirsiniz TryGetValue. Her iki yöntemi de açık arabirim uygulamasını kullanarak uygular, bu yüzden ilk önce IDictionary<string, JToken>olsa dönüştürmeden bunları kullanamazsınız .


Bunun yavaş yavaş kabul edilen cevaptan sonra olacağını düşünüyorum, ama teşekkürler.
SevenDays

2
@wsevendays, hız burada sizin için önemli mi yoksa sadece mikrooptimizasyon yapıyor (ve tahminlere dayandırıyor)? Daha okunabilir bulduklarınızı kullanmalısınız.
svick

WP7 telefonumun 1GHz işlemcisinin hızı çok iyi değil ve hızı önemsemem gerekiyor.
SevenDays

1
@wsevendays: Neden kabul edilen yanıttan daha yavaş (veya daha hızlı)?
Jon Skeet

24
@wsevenday: Hayır, sözlük oluşturmaz . JObject zaten uygular IDictionary<string, JToken> . Bu sadece bir referans ödevidir. Ve hayır, kabul edilen cevap anahtarın bir dizide olup olmadığını kontrol etmiyor ... hala normal bir dizinleyici kullanıyor. O Çünkü görünüyor dizi erişimi gibi o anlamına gelmez olduğunu dizisi erişimi. (Dizi erişimi ilk etapta bir dize ile olamaz.)
Jon Skeet

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.