2012-05-10 93 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