如何通过 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' to 'Newtonsoft.Json.Linq.JProperty'" 移除强制转换工作,但是: var key = x.Key; var jvalue = x.Value; - 至少它可以编译......我明天会捷克的功能。【参考方案4】:

对于像我这样的人,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 反序列化为 .NET 对象

JObject对象如何获取深度属性值&不判断key是否存在获取值&获取含有特殊字符的key值

如何使用 json.net 将 json 数组添加到 JObject 的属性中

C# 通过JObject解析json对象