如何通过JObject枚举?


109

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

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

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

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

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

Answers:


166

如果您查看有关的文档JObject,将会发现它实现了IEnumerable<KeyValuePair<string, JToken>>。因此,您可以使用以下命令简单地对其进行迭代foreach

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

3
这是正确的,但是由于我不明白的原因,除非明确将其转换为可枚举类型,否则您不能将其与Linq一起使用。即您, ((IEnumerable<KeyValuePair<string, JToken>>)obj).Select(...)而不是普通人obj.Select(...);至少这就是我在代码中找到的一部分。
Adrian Ratnapala 2014年

2
@AdrianRatnapala您的obj是否声明为动态的?扩展方法(例如Enumerable.Select)不起作用。
svick

1
不,在我的情况下obj为type JObject; 但JObject似乎有类似的问题dynamic。编译器无法将类型参数推断为.Select。我可以显式地给他们,obj.Select<KeyValuePair<string, JToken>, (result type)>(...)也对我的作品
阿德里安Ratnapala

3
@AdrianRatnapala嗯,你是对的。这是因为同时JObject实现IEnumerable<KeyValuePair<string, JToken>>和和IEnumerable<JToken>(通过间接实现JContainer)。
svick 2014年

3
现在如何将其用于嵌套JSON?例如,如果“值”包含另一组键:值对,那么如何使用JToken value来遍历下一组对?
AlbatrossCafe 2015年

53

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

3
您也可以方便地使用LINQ像这样:obj.Properties().Select(p => p.Name + ": " + p.Value)
itslittlejohn

这正是我想要的信息。非常感谢!
jhoepken

15

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

这是对我有用的答案:

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

1
这样(在此行之后:JObject priceComplianceJson = JObject.Parse(File.ReadAllText(fullPath));)我得到,“无法转换类型'System.Collections.Generic.KeyValuePair <string,Newtonsoft.Json.Linq.JToken>到'Newtonsoft.Json.Linq.JProperty'“尽管删除了强制转换,但是:var key = x.Key; var jvalue = x.Value; -至少可以编译...明天我将介绍该功能。
B. Clay Shannon

3

对于像我这样的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 } ); 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.