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.