Json.net - 解析具有未知属性名称的数组

时间:2018-01-09 04:12:27

标签: c# json.net

如果在开发时不知道名称,如何从嵌套数组中选择属性。例如,如果我想得到这个名字" 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"}

4 个答案:

答案 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属性的值,可以使用带有递归下降SelectTokensJsonPath 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 + ")");
}

小提琴:https://dotnetfiddle.net/WmSOBU