关于c#:如何通过JObject枚举?

How do I enumerate through a JObject?

我试图确定如何访问JObject中的数据,但我终生无法确定如何使用它。

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

我可以将其打印到执行Console.WriteLine(Object)的控制台中,然后看到数据,它看起来像:

1
2
3
4
{
"my_data" :"more of my string data"
...
}

但是我不知道如何迭代/枚举它,任何人都有想法吗? 我现在很茫然。


如果查看JObject的文档,您会发现它实现了IEnumerable>。 因此,您可以使用foreach对其进行迭代:

1
2
3
4
5
6
foreach (var x in obj)
{
    string name = x.Key;
    JToken value = x.Value;
    …
}


可以通过将JProperty对象强制转换为JToken来枚举JObjects:

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

如果在另一个JObject内有嵌套的JObject,则不需要强制转换,因为访问器将返回JToken:

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


答案对我不起作用。 我不知道它怎么得到这么多票。 尽管它帮助我指明了方向。

这是对我有用的答案:

1
2
3
4
5
foreach (var x in jobj)
{
    var key = ((JProperty) (x)).Name;
    var jvalue = ((JProperty)(x)).Value ;
}


对于像我这样的linq上瘾者,并根据svick的回答,这里有一个linq方法:

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

现在您可以使linq表达式如下:

1
2
3
4
5
6
JToken x = obj_linq
          .Where( d => d.Key =="my_key")
          .Select(v => v)
          .FirstOrDefault()
          .Value;
string y = ((JValue)x).Value;

要不就:

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

或用这个遍历所有数据:

1
obj_linq.ToList().ForEach( x => { do stuff } );