Answers:
如果您查看有关的文档JObject
,将会发现它实现了IEnumerable<KeyValuePair<string, JToken>>
。因此,您可以使用以下命令简单地对其进行迭代foreach
:
foreach (var x in obj)
{
string name = x.Key;
JToken value = x.Value;
…
}
obj
为type JObject
; 但JObject
似乎有类似的问题dynamic
。编译器无法将类型参数推断为.Select
。我可以显式地给他们,obj.Select<KeyValuePair<string, JToken>, (result type)>(...)
也对我的作品
JObject
实现IEnumerable<KeyValuePair<string, JToken>>
和和IEnumerable<JToken>
(通过间接实现JContainer
)。
JToken value
来遍历下一组对?
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;
}
obj.Properties().Select(p => p.Name + ": " + p.Value)
。
答案对我不起作用。我不知道它怎么得到这么多票。尽管它帮助我指明了方向。
这是对我有用的答案:
foreach (var x in jobj)
{
var key = ((JProperty) (x)).Name;
var jvalue = ((JProperty)(x)).Value ;
}
对于像我这样的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 } );
((IEnumerable<KeyValuePair<string, JToken>>)obj).Select(...)
而不是普通人obj.Select(...)
;至少这就是我在代码中找到的一部分。