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



当开发时不知道名称时,如何从嵌套数组中选择属性。例如,如果我想从"商店"数组中获取名称"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

相关内容

  • 没有找到相关文章

最新更新