在不知道字段名称的情况下提取特定的JSON字段?

时间:2012-05-02 06:30:25

标签: .net json json.net

看起来好的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而不是当前格式的数组,但我没有定义它。

1 个答案:

答案 0 :(得分: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)
}