Получить значение внутреннего массива относительно указанного значения свойства внутреннего массива в сочетании с указанным значением свойства внешнего массива

На основании утвержденного 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 лет" и GrowthRateItem свойство массива, ["ItemDescriptionText"]["txt"]Значение также является указанным значением в данном случае "Общее количество сотрудников" или "Доход от продаж".

Запрос LINQ to JSON должен реализовывать только один случай из четырех случаев, подразумеваемых четырьмя значениями, перечисленными выше.

Я не смог расширить следующее решение, используемое для решения аналогичной проблемы.

LINQ Запрос для получения значения внутреннего массива на основе двух значений свойств из внешнего массива.

    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();

Строка JSON:

{
    "IndustryCode": [{
            "attrCodeValue": 25838,
            "attrTypeText": "DBH Industry Code",
            "IndustryCode": {
                "txt": "1063"
            },
            "IndustryCodeDescription": [{
                "attrLanguageCode": 39,
                "attrIndustryCodeDescriptionLengthCode": 9120,
                "txt": "Legal Services"
            }],
            "DisplaySequence": 1
        },
        {
            "attrCodeValue": 700,
            "attrTypeText": "NAICS",
            "IndustryCode": {
                "txt": "541110"
            },
            "IndustryCodeDescription": [{
                "attrLanguageCode": 39,
                "attrIndustryCodeDescriptionLengthCode": 9120,
                "txt": "Offices of Lawyers"
            }],
            "DisplaySequence": 1
        },
        {
            "attrCodeValue": 24664,
            "attrTypeText": "North American Industry Classification System 2012",
            "IndustryCode": {
                "txt": "541110"
            },
            "IndustryCodeDescription": [{
                "attrLanguageCode": 39,
                "attrIndustryCodeDescriptionLengthCode": 9120,
                "txt": "Offices of Lawyers"
            }],
            "DisplaySequence": 1
        },
        {
            "attrCodeValue": 21182,
            "attrTypeText": "UK SIC 2003",
            "IndustryCode": {
                "txt": "74.110"
            },
            "IndustryCodeDescription": [{
                "attrLanguageCode": 39,
                "attrIndustryCodeDescriptionLengthCode": 9120,
                "txt": "Legal activities"
            }],
            "DisplaySequence": 1
        },
        {
            "attrCodeValue": 3599,
            "attrTypeText": "DBS Industry Code",
            "IndustryCode": {
                "txt": "81119901"
            },
            "IndustryCodeDescription": [{
                "attrLanguageCode": 39,
                "attrIndustryCodeDescriptionLengthCode": 2121,
                "txt": "GENRL PRACTICE ATTY"
            }],
            "DisplaySequence": 1
        },
        {
            "attrCodeValue": 399,
            "attrTypeText": "US Standard Industry Code 1987 - 4 digit",
            "IndustryCode": {
                "txt": "8111"
            },
            "IndustryCodeDescription": [{
                "attrLanguageCode": 39,
                "attrIndustryCodeDescriptionLengthCode": 1441,
                "txt": "Legal services office"
            }],
            "DisplaySequence": 1
        }
    ]
}

Я перечислил вышеупомянутое решение, чтобы показать структуру, в которой я пытаюсь решить поставленный вопрос.

1 ответ

Решение

Как насчет этого?

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

Другие вопросы по тегам