【问题标题】:How do I enumerate through a JObject?如何通过 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"
...
}

但我不知道如何迭代/枚举它,有人有什么想法吗?我现在很茫然。

【问题讨论】:

    标签: c# json json.net


    【解决方案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 } ); 
    

    【讨论】:

      猜你喜欢
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多