如果在开发时不知道名称,如何从嵌套数组中选择属性。例如,如果我想得到这个名字" SamsClub"来自" Store"数组,但不想硬编码数组名,因为可以有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"}
答案 0 :(得分:0)
这样可行。但是,我建议你重新构建你的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");
答案 1 :(得分:0)
这应该有效:
List<string> l = new List<string>();
foreach (JToken token in jObject.SelectTokens("$..Store[0].name"))
l.Add(token.ToString());
答案 2 :(得分:0)
尝试在Dictionary<string,object>
中进行递归反序列化:-)我通常在相同的情况下这样做。
答案 3 :(得分:0)
如果您要尝试获取JSON中所有name
属性的值,可以使用带有递归下降SelectTokens
的JsonPath expression来获取它们:
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 + ")");
}