web-dev-qa-db-ja.com

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

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

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

Console.WriteLine(Object)を実行してコンソールに印刷すると、データが表示されます。

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

しかし、私はそれを単に反復/列挙する方法がわからない、誰もがアイデアを持っていますか?私は今そのような損失にいます。

92
Geesu

JObjectのドキュメント を見ると、IEnumerable<KeyValuePair<string, JToken>>を実装していることがわかります。したがって、foreachを使用して単純に反復処理できます。

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

JObjects は、 JProperty オブジェクトを介して列挙できます JToken

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;
}
44
Daniel

答えは私にはうまくいきませんでした。どうしてこれほど多くの票を得たのか分かりません。それは私を方向に向けるのに役立ちましたが。

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

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

私のような人のために、linq addicts、そして svick's answer に基づいて、ここに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 } ); 
1
dani herrera