0

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

4

1 回答 1

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)
}
于 2012-05-04T20:47:08.807 回答