2012-05-10 65 views
65

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

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

我可以将它打印到控制台做Console.WriteLine(对象),我看到的数据,它看起来像:

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

,但我不知道如何只是想迭代/枚举通过它,任何人有任何想法?我现在处于这样的状态。

回答

103

如果你看看the documentation for JObject,你会发现它实现了IEnumerable<KeyValuePair<string, JToken>>。所以,你可以在它简单地使用foreach迭代:

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

这是正确的,但出于我不明白的原因,除非明确转换为可枚举类型,否则不能将其与Linq一起使用。即你((IEnumerable >)obj).Select(...)'而不是普通的'obj.Select(...)';或者至少这是我发现它是我的代码的一部分。 –

+1

@AdrianRatnapala你的obj声明是动态的吗?扩展方法(如Enumerable.Select)不适用于此。 – svick

+1

不,在我的例子中'obj'的类型是'JObject';但'JObject'似乎和'dynamic'有类似的问题。编译器不能推断'.Select'的类型参数。我可以明确地给他们,'obj.Select ,(结果类型)>(...)'也适用于我 –

8

答案并没有为我工作。我不知道它是如何得到这么多票。尽管它帮助我指出了一个方向。

这是为我工作的回答:

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 <字符串,Newtonsoft.Json.Linq.JToken> '到'Newtonsoft.Json.Linq.JProperty'“ 删除铸件的工作,虽然:var key = x.Key; var jvalue = x.Value; - 至少它编译...我明天将捷克的功能。 –

26

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

感谢您提供有用的信息! – SimplyInk

+1

你也可以像使用linq一样方便地使用:'obj.Properties()。Select(p => p.Name +“:”+ p.Value)'。 – itslittlejohn