Получить значение внутреннего массива относительно указанного значения свойства внутреннего массива в сочетании с указанным значением свойства внешнего массива - PullRequest
0 голосов
/ 08 ноября 2018

На основе утвержденного 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 Ответ

0 голосов
/ 08 ноября 2018

Как насчет чего-то подобного?

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

Fiddle: https://dotnetfiddle.net/KVslv2

...