【问题标题】:Extract particular JSON fields without knowing the field names?在不知道字段名称的情况下提取特定的 JSON 字段?
【发布时间】:2012-05-11 15:42:26
【问题描述】:

看起来好的 JSON 对象通常具有名称-值对,如果它有多个项目,则值为 JSON 数组。这更容易解析。

但我遇到了一个烦人的案例,我不确定如何解析。虽然我的问题是针对 .NET 的,并且我在 CodePlex 上使用 JSON.NET 库(主要是 LINQ to JSON 方法,但也可以采用其他方法),但我也想知道在其他语言平台上是如何处理的。

烦人的情况是 JSON 没有数组和名称-值对仅在最低级别的子级,JSON 对象的节点包含更多对象,直到我们将属性作为名称-值对的最低级别。而且我想提取中间节点的列表,并且在进行查询时事先不知道它们的节点名称(它们是动态的)。您如何查询它们或遍历它们。下面是一个示例 - 我想要所有“响应”子节点的名称。 albumData 属性的父名称,即“Twenty5MBPhotos”和“TestPhotos”。

{"status":200,"message":"OK","response":{"Twenty5MBPhotos":{"__albumData":{"id":"67b0de21d48290741598"}},"FiveMBPhotos":{"__albumData":{"id":"67b0de21d4a72ac5b401"}},"TestPhotos":{"__albumData":{"id":"67b0de21d64693a7f49f"}},"Sample album":{"__albumData":{"id":"67b0de21d67c4a99f4c3"}},"Empty":{"__albumData":{"id":"67b0de21d5fc3f2e05ac"}},"me":{"__albumData":{"id":"67b0de21d5bd2d1ea4f9"}},"satx":{"__albumData":{"id":"67b0de21d5b2f929c473"}},"designs":{"__albumData":{"id":"67b0de21d5a29b9f45c0"}},"views":{"__albumData":{"id":"67b0de21d5958c3b652e"}},"Puppy":{"__albumData":{"id":"67b0de21d540884dc413"}},"QaTest":{"__albumData":{"id":"67b0de21d6d96c35d419"}},"random":{"__albumData":{"id":"67b0de21d6b89b9ab401"}}}}

坦率地说,JSON 格式本来可以更简单,结果是一个具有专辑名称和专辑 ID 属性的数组,而不是当前格式,但我没有定义这个。

【问题讨论】:

    标签: .net json json.net


    【解决方案1】:

    你可以像这样得到所有的名字:

        JObject obj = JObject.Parse(json);
        var children= obj["response"];
    
        foreach (var item in children)
        {
            string val = ((JProperty)item).Name;   
        }
    

    只需要将 JToken 转换为 JProperty 即可获取名称值。

    更新:

    或者使用一些 linq

    var theNamesAndIds = children.ToDictionary(m => ((JProperty)m).Name,
                                               m => m.First()["__albumData"]["id"]);
    
    foreach (var item in theNamesAndIds)
    {
        //item has your key(name) and value(Id)
    }
    

    【讨论】:

    • 谢谢,有机会我会试试看的。
    • 还有一个后续问题 geepie,我如何使用 linq 查询中的字典来遍历每个名​​称、id 对?
    • @David 上面的例子 theNamesAndIds 将返回一个名称和 ID 的字典,如果你愿意,你可以迭代其中的键值对。我添加了一些示例代码
    • 对不起,还没开始。忙于工作和个人事务。有机会我会试试的thanx。
    • 终于开始尝试了。代码有效。谢谢吉派。
    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多