如何通过 JObject 进行枚举?
Posted
技术标签:
【中文标题】如何通过 JObject 进行枚举?【英文标题】:How do I enumerate through a JObject? 【发布时间】:2012-05-19 14:05:19 【问题描述】:我正在尝试确定如何访问我的 JObject 中的数据,但我无法确定如何使用它。
JObject Object = (JObject)Response.Data["my_key"];
我可以通过 Console.WriteLine(Object) 将它打印到控制台,然后我看到了数据,它看起来像:
"my_data" : "more of my string data"
...
但我不知道如何迭代/枚举它,有人有什么想法吗?我现在很茫然。
【问题讨论】:
【参考方案1】:如果您查看the documentation for JObject
,您会发现它实现了IEnumerable<KeyValuePair<string, JToken>>
。因此,您可以简单地使用 foreach
对其进行迭代:
foreach (var x in obj)
string name = x.Key;
JToken value = x.Value;
…
【讨论】:
这是正确的,但由于我不明白的原因,除非您明确转换为可枚举类型,否则您不能将其与 Linq 一起使用。 IE。你((IEnumerable<KeyValuePair<string, JToken>>)obj).Select(...)
而不是普通的obj.Select(...)
;或者至少那是我发现它是我代码的一部分。
@AdrianRatnapala 您的 obj 声明为动态的吗?扩展方法(如 Enumerable.Select)不适用于此。
@AdrianRatnapala 嗯,你是对的。这是因为JObject
实现了IEnumerable<KeyValuePair<string, JToken>>
和IEnumerable<JToken>
(间接通过JContainer
)。
现在如何将它用于嵌套 JSON?例如,如果“值”包含另一组键:值对,我如何使用JToken value
来遍历下一组对?
@AdrianRatnapala 尝试在JObject
上使用Properties()
方法。例如:jObject.Properties().Select(p => p.Name + ": " + p.Value)
.【参考方案2】:
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;
【讨论】:
你也可以像这样方便地使用 linq:obj.Properties().Select(p => p.Name + ": " + p.Value)
.
这正是我正在寻找的信息。非常感谢!【参考方案3】:
答案对我不起作用。我不知道它是如何获得这么多票的。虽然它有助于为我指明方向。
这是对我有用的答案:
foreach (var x in jobj)
var key = ((JProperty) (x)).Name;
var jvalue = ((JProperty)(x)).Value ;
【讨论】:
这样(在这一行之后:JObject priceComplianceJson = JObject.Parse(File.ReadAllText(fullPath));)我得到,“无法转换类型'System.Collections.Generic.KeyValuePair对于像我这样的人,linq 上瘾者,基于svick's answer,这里有一个 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 );
【讨论】:
以上是关于如何通过 JObject 进行枚举?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Dictionary<string,string> 添加到现有 JSON.Net 的 JObject?
如何使 Newtonsoft.Json.Linq.JObject 不可变?
JObject对象如何获取深度属性值&不判断key是否存在获取值&获取含有特殊字符的key值