当开发时不知道名称时,如何从嵌套数组中选择属性。例如,如果我想从"商店"数组中获取名称"SamsClub",但不想对数组名称进行硬编码,因为可能有 n 个数组。
["部分"]["商店"]["名称"]
示例 JSON
{
"luna": [],
"sections": {
"Bank": [
{
"name": "Costco"
}
],
"Store": [
{
"name": "SamsClub"
}
],
"Business": [
{
"name": "BJs"
}
]
}}
到目前为止,我的代码如下所示。
JObject o = JObject.Parse(jsonString);
var pc = o.GetValue("sections");
之后,其余代码不起作用,或者我没有使用正确的过程。JToken 看起来很有希望,但我显然错过了一些东西。
修订版 1 - 更新了 json 以包含来自源的实时输出。
{
"image_prefixes": [],
"prod_and_cats": {
"Accessories": [
{
"name": "Logo",
"position": 8
}
],
"Keys": [
{
"name": "Independent",
"position": 8
}
],
"Bags": [
{
"name": "Nylon",
"position": 10
}
],
"Lock": [
{
"name": "Camp",
"position": 6
}
],
"Sweat": [
{
"name": "Decline Hooded Sweatshirt",
"position": 0
}
],
"Door": [
{
"name": "Zip ",
"position": 0
}
]
},
"api_update": "2018-02",
"release": "12/28/2019",
"week": "17"}
这将起作用。但是,我建议您重组JSON以使其更加通用,这样您就不必遇到麻烦。
var str = "{"luna":[],"sections":{"Bank":[{"name":"Costco"}],"Store":[{"name":"SamsClub"}],"Business":[{"name":"BJs"}]}}";
JObject o = JObject.Parse(str);
var sections = o.GetValue("sections").ToList();
var elem = sections.Find(x => x.ToList()[0][0]["name"].ToString() == "SamsClub");
尝试在Dictionary<string,object>
中进行递归反序列化:-(我通常在同样的情况下这样做。
如果您尝试获取 JSON 中所有name
属性的值,则可以使用带有递归下降 JsonPath 表达式的SelectTokens
来获取它们:
JObject o = JObject.Parse(jsonString);
List<string> names = o.SelectTokens("$..name")
.Select(t => (string)t)
.ToList();
小提琴:https://dotnetfiddle.net/qjeaMt
如果你想要名称及其相应的数组名称,你可以这样做:
var namesAndCategories = o.SelectTokens("$..name")
.Select(t => new
{
Name = (string)t,
Category = ((JProperty)t.Parent.Parent.Parent.Parent).Name
})
.ToList();
foreach (var item in namesAndCategories)
{
Console.WriteLine(item.Name + " (" + item.Category + ")");
}
小提琴:https://dotnetfiddle.net/WmSOBU