如何通过JObject枚举?

时间:2012-05-10 23:30:16

标签: c# json json.net

我正在尝试确定如何访问我的JObject中的数据,但我无法确定如何使用它。

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

我可以将它打印到Console上执行Console.WriteLine(Object),我看到了数据,它看起来像:

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

但我不知道如何通过它迭代/枚举,任何人都有任何想法?我现在正处于亏损状态。

4 个答案:

答案 0 :(得分:141)

如果查看the documentation for JObject,您会看到它实现了IEnumerable<KeyValuePair<string, JToken>>。因此,您可以使用foreach

进行迭代
foreach (var x in obj)
{
    string name = x.Key;
    JToken value = x.Value;
    …
}

答案 1 :(得分:38)

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

答案 2 :(得分:10)

答案对我不起作用。我不知道它是如何得到这么多的选票。虽然它帮助我指明了方向。

这是对我有用的答案:

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

答案 3 :(得分:0)

对于像我这样的人, linq上瘾者,并基于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 } );