检索相对于指定内部数组属性值和指定外部数组属性值配对的内部数组值

时间:2018-11-08 00:59:28

标签: c# json linq json.net linq-to-json

基于以下经过验证的JSON:

{
    "GrowthRates": [{
            "FinancialStatementHeader": {
                "TimePeriodText": {
                    "attrCodeValue": 11096,
                    "txt": "Between 0 and 12 months"
                }
            },
            "ComparedToFinancialStatementHeader": {
                "TimePeriodText": {
                    "attrCodeValue": 13711,
                    "txt": "1-3 years"
                }
            },
            "GrowthRateItem": [{
                    "ItemDescriptionText": {
                        "attrCodeValue": 6240,
                        "txt": "Total number of employees"
                    },
                    "ItemRate": 0
                },
                {
                    "ItemDescriptionText": {
                        "attrCodeValue": 3110,
                        "txt": "Sales Revenue"
                    },
                    "ItemRate": 0
                }
            ]
        },
        {
            "FinancialStatementHeader": {
                "TimePeriodText": {
                    "attrCodeValue": 11096,
                    "txt": "Between 0 and 12 months"
                }
            },
            "ComparedToFinancialStatementHeader": {
                "TimePeriodText": {
                    "attrCodeValue": 13721,
                    "txt": "1-5 years"
                }
            },
            "GrowthRateItem": [{
                    "ItemDescriptionText": {
                        "attrCodeValue": 6240,
                        "txt": "Total number of employees"
                    },
                    "ItemRate": 0
                },
                {
                    "ItemDescriptionText": {
                        "attrCodeValue": 3110,
                        "txt": "Sales Revenue"
                    },
                    "ItemRate": 0
                }
            ]
        }
    ]
}

我需要以字符串形式检索ItemRate值,其中GrowthRates数组属性["ComparedToFinancialStatementHeader"]["TimePeriodText"]["txt"]在这种情况下为“ 1-3年”或“ 1-5年”,而{ 1}}数组属性GrowthRateItem的值在这种情况下也是“员工总数”或“销售收入”的指定值。

LINQ to JSON查询只需要实现上面列出的四个值所隐含的四种情况中的一种。

我无法扩展用于解决类似问题的以下解决方案。

LINQ查询基于外部数组中的两个属性值检索内部数组值。

["ItemDescriptionText"]["txt"]

JSON字符串:

    JToken jsonTkn = JToken.Parse(jsonString);

    string jsonValue = jsonTkn["IndustryCode"]
           .Where(icItem => icItem["attrTypeText"].Value<string>() == "NAICS" && icItem["DisplaySequence"].Value<string>() == "1")
           .Select(icItem => icItem["IndustryCodeDescription"].First()["txt"].Value<string>())
           .First().ToString().ToUpper();

我列出了以上解决方案,以显示试图解决提出的问题的结构。

1 个答案:

答案 0 :(得分:0)

这样的事情怎么样?

public static string GetItemRate(JObject obj, string timePeriodText, string itemDescriptionText)
{
    return obj.SelectToken("GrowthRates")
              .First(jo => (string)jo.SelectToken("ComparedToFinancialStatementHeader.TimePeriodText.txt") == timePeriodText)
              .SelectToken("GrowthRateItem")
              .First(jo => (string)jo.SelectToken("ItemDescriptionText.txt") == itemDescriptionText)
              .SelectToken("ItemRate")
              .Value<string>();
}

然后像这样使用它:

JObject obj = JObject.Parse(jsonString);
string rate = GetItemRate(obj, "1-3 years", "Sales Revenue");

提琴:https://dotnetfiddle.net/KVslv2