如何通过 JObject 进行枚举?

我试图确定如何访问 JObject 中的数据,但我无论如何也不能确定如何使用它。

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

我可以把它打印到 Console. WriteLine (Object)的控制台上,然后我看到数据,它看起来像这样:

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

但我不知道如何只是迭代/枚举通过它,任何人有任何想法?我现在很迷茫。

164274 次浏览

如果查看 JObject的文件,您将看到它实现了 IEnumerable<KeyValuePair<string, JToken>>。因此,您可以使用 foreach对它进行迭代:

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

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

这是对我起作用的答案:

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

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

对于像我这样的人,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 } );