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