json.netには重要な方法がありますか?


139

私の応答にキー「エラー」がある場合、エラーを処理して警告ボックスを表示する必要があります。

json.netには「ハスキー」メソッドが存在しますか?お気に入り:

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

1
ここで私の答えを参照してください。
ベン

私はここで同様の問題の質問に答えました:stackoverflow.com/a/47204235/1037314
Ben

1
この質問には2つのバリエーションがあります。1つはJSON辞書がフラット(子なし)であり、もう1つはキーが子の階層のどこかにある場合です。これを書いている時点では、ns.jsonにはキーのテストに簡単にアクセスできる便利なメソッドがまだありません。
ljgww 2018

回答:


239

だけを使用してくださいx["error_msg"]。プロパティが存在しない場合はを返しますnull


37
プロパティの値がの場合はどうなりますnullか?
Andreas Furster、2015年

67
@AndreasFursterすると、それだけJValueValuenullなく、whosが返されnullます。
2015年

1
プロパティが可能であれば、プロパティがJSONオブジェクトで定義されているかどうかを確認nullするx["error_msg"] is Objectために使用できます
stonito

2
@ user3199329これはを書くのx["error_msg"] != nullに混乱を招く方法なので、いいえ、プロパティが存在し、の値を持っていることをチェックしませんnull
2016年

9
@ WilliamT.Mallard C#6では、null条件付きインデックス演算子を使用してこれを簡略化できますmyJObject["level1property"]?["level2property"]
2017年

98

JObjectを実装IDictionary<string, JToken>しているため、以下を使用できます。

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

...または使用できますTryGetValue。明示的なインターフェイス実装を使用して両方のメソッドを実装するためIDictionary<string, JToken>、最初に変換せずにそれらを使用することはできません。


これを薄くすると、受け入れられた回答よりもゆっくりになりますが、ありがとうございます。
セブンデイズ

2
@wsevendays、ここで速度は重要ですか、それとも単にマイクロ最適化していますか(そして推測に基づいています)?読みやすいものを使用する必要があります。
スピック2008

私のWP7電話の1GHzプロセッサの速度はあまり良くないので、速度に注意する必要があります。
セブンデイズ、2011

1
@wsevendays:受け入れられた回答よりも遅い(または速い)のはなぜですか?
Jon Skeet、2011

24
@wsevenday:いいえ、辞書は作成されません。JObject すでに実装しています IDictionary<string, JToken>。これは単なる参照割り当てです。そして、いいえ、受け入れられた答えは、キーが配列にあるかどうかをチェックしていません...それはまだ通常のインデクサーを使用しています。それが理由だけに見える配列アクセスのように、それは意味しない配列アクセス。(そもそも配列アクセスは文字列によって行うことはできません。)
Jon Skeet

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.