131

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

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

我可以将它打印到控制台执行 Console.WriteLine(Object) 并且我看到数据,它看起来像:

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

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

4

4 回答 4

207

如果您查看的文档JObject,您将看到它实现了IEnumerable<KeyValuePair<string, JToken>>. 因此,您可以简单地使用 a 对其进行迭代foreach

foreach (var x in obj)
{
    string name = x.Key;
    JToken value = x.Value;
    …
}
于 2012-05-10T23:35:38.353 回答
62

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;
}
于 2015-12-24T17:13:06.900 回答
20

答案对我不起作用。我不知道它是如何获得这么多票的。尽管它有助于为我指明方向。

这是对我有用的答案:

foreach (var x in jobj)
{
    var key = ((JProperty) (x)).Name;
    var jvalue = ((JProperty)(x)).Value ;
}
于 2015-04-12T03:35:47.900 回答
4

对于像我这样的人,linq addicts ,并且基于 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 } ); 
于 2018-12-12T15:13:19.677 回答