How do I enumerate through a JObject?
我试图确定如何访问JObject中的数据,但我终生无法确定如何使用它。
1 | JObject Object = (JObject)Response.Data["my_key"]; |
我可以将其打印到执行Console.WriteLine(Object)的控制台中,然后看到数据,它看起来像:
1 2 3 4 | { "my_data" :"more of my string data" ... } |
但是我不知道如何迭代/枚举它,任何人都有想法吗? 我现在很茫然。
如果查看
1 2 3 4 5 6 | foreach (var x in obj) { string name = x.Key; JToken value = x.Value; … } |
可以通过将JProperty对象强制转换为JToken来枚举JObjects:
1 2 3 4 | foreach (JProperty x in (JToken)obj) { // if 'obj' is a JObject string name = x.Name; JToken value = x.Value; } |
如果在另一个JObject内有嵌套的JObject,则不需要强制转换,因为访问器将返回JToken:
1 2 3 4 | foreach (JProperty x in obj["otherObject"]) { // Where 'obj' and 'obj["otherObject"]' are both JObjects string name = x.Name; JToken value = x.Value; } |
答案对我不起作用。 我不知道它怎么得到这么多票。 尽管它帮助我指明了方向。
这是对我有用的答案:
1 2 3 4 5 | foreach (var x in jobj) { var key = ((JProperty) (x)).Name; var jvalue = ((JProperty)(x)).Value ; } |
对于像我这样的linq上瘾者,并根据svick的回答,这里有一个linq方法:
1 2 3 4 | using System.Linq; //... //make it linq iterable. var obj_linq = Response.Cast<KeyValuePair<string, JToken>>(); |
现在您可以使linq表达式如下:
1 2 3 4 5 6 | JToken x = obj_linq .Where( d => d.Key =="my_key") .Select(v => v) .FirstOrDefault() .Value; string y = ((JValue)x).Value; |
要不就:
1 2 3 4 | var y = obj_linq .Where(d => d.Key =="my_key") .Select(v => ((JValue)v.Value).Value) .FirstOrDefault(); |
或用这个遍历所有数据:
1 | obj_linq.ToList().ForEach( x => { do stuff } ); |