JObjectを介して列挙するにはどうすればよいですか?


110

私はJObjectにあるデータにアクセスする方法を決定しようとしていますが、それを使用する方法を一生かけて決定することはできません。

JObject Object = (JObject)Response.Data["my_key"];

Console.WriteLine(Object)を実行してコンソールに出力すると、次のようなデータが表示されます。

{
 "my_data" : "more of my string data"
...
}

しかし、私はそれを単に反復/列挙する方法がわかりません、誰かが何かアイデアを持っていますか?今、私は途方に暮れています。

回答:


166

あなたが見ればのドキュメントJObject、あなたはそれが実装されていることがわかりますIEnumerable<KeyValuePair<string, JToken>>。したがって、単に次のように使用して反復できますforeach

foreach (var x in obj)
{
    string name = x.Key;
    JToken value = x.Value;
    
}

3
これは正しいですが、理解できない理由により、列挙型に明示的にキャストしない限り、Linqで使用することはできません。つまり((IEnumerable<KeyValuePair<string, JToken>>)obj).Select(...)、昔ながらの代わりにあなた obj.Select(...)。または、少なくともそれがコードの一部であることがわかりました。
エイドリアンラトナパラ2014年

2
@AdrianRatnapalaあなたのオブジェクトは動的に宣言されていますか?拡張メソッド(Enumerable.Selectなど)はそれでは機能しません。
2014年

1
いいえ、私の場合objはタイプJObjectでした。しかしJObjectと同様の問題を持っているようですdynamic。コンパイラは、型引数をに推測できません.Select。私はそれらを明示的に与えることができobj.Select<KeyValuePair<string, JToken>, (result type)>(...)、私にも役立ちます
Adrian Ratnapala 2014年

3
@AdrianRatnapalaうーん、あなたは正しい。とのJObject両方IEnumerable<KeyValuePair<string, JToken>>IEnumerable<JToken>(を介して間接的にJContainer)実装しているためです。
2014年

3
ネストされたJSONに使用するにはどうすればよいですか?たとえば、「値」にkey:valueペアの別のセットが含まれている場合、を使用しJToken valueて次のペアのセットを反復処理する方法を教えてください。
AlbatrossCafe

53

JObjectsは、それをJTokenにキャストすることにより、JPropertyオブジェクトを介して列挙できます。

foreach (JProperty x in (JToken)obj) { // if 'obj' is a JObject
    string name = x.Name;
    JToken value = x.Value;
}

別のJObject内にネストされたJObjectがある場合は、アクセサーがJTokenを返すため、キャストする必要はありません。

foreach (JProperty x in obj["otherObject"]) { // Where 'obj' and 'obj["otherObject"]' are both JObjects
    string name = x.Name;
    JToken value = x.Value;
}

3
linqを次のように使用することもできますobj.Properties().Select(p => p.Name + ": " + p.Value)
itslittlejohn 2017

これはまさに私が探していた情報でした。どうもありがとうございます!
jhoepken

15

答えはうまくいきませんでした。どのようにして多くの票を獲得したのかわかりません。それは方向性を示すのに役立ちましたが。

これは私のために働いた答えです:

foreach (var x in jobj)
{
    var key = ((JProperty) (x)).Name;
    var jvalue = ((JProperty)(x)).Value ;
}

1
これで(この行の後:JObject priceComplianceJson = JObject.Parse(File.ReadAllText(fullPath));)、「型 'System.Collections.Generic.KeyValuePair <string、Newtonsoft.Json.Linq.JToken>」を変換できません'Newtonsoft.Json.Linq.JProperty'へ」キャストの削除は機能しますが、次のようになります。var key = x.Key; var jvalue = x.Value; -少なくともコンパイルできます...機能は明日チェコ語にします。
B.クレイシャノン2015

3

私のような人々、linq中毒者、そしてsvickの答えに基づいて 、ここでlinqアプローチ:

using System.Linq;
//...
//make it linq iterable. 
var obj_linq = Response.Cast<KeyValuePair<string, JToken>>();

これで、次のようなlinq式を作成できます。

JToken x = obj_linq
          .Where( d => d.Key == "my_key")
          .Select(v => v)
          .FirstOrDefault()
          .Value;
string y = ((JValue)x).Value;

あるいは単に:

var y = obj_linq
       .Where(d => d.Key == "my_key")
       .Select(v => ((JValue)v.Value).Value)
       .FirstOrDefault();

または、これはすべてのデータを反復処理します:

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