Фильтровать и группировать свойства из JArray

Я получаю массив из API следующим образом:

[
    {
        "uniqueId": "Env30362",
        "field": "StartDate",
        "value": "1999-01-01",
        "modificationDateTime": "2020-12-12T04:10:55.0970000Z",
        "modificationState": "Created"
    },
    {
        "uniqueId": "Env30362",
        "field": "EndDate",
        "value": "2020-01-01",
        "modificationDateTime": "2020-12-12T04:10:55.0970000Z",
        "modificationState": "Created"
    },
    {
        "uniqueId": "Env30363",
        "field": "AnnualIncentiveCurrency",
        "value": "EUR",
        "modificationDateTime": "2020-12-06T04:10:52.0970000Z",
        "modificationState": "Created"
    },
    {
        "uniqueId": "Env30363",
        "field": "NatureOfContract",
        "value": "Permanent",
        "modificationDateTime": "2020-12-06T04:10:52.0970000Z",
        "modificationState": "Created"
    },
    {
        "uniqueId": "Env30363",
        "field": "FinalProcessDate",
        "value": "2020-12-01",
        "modificationDateTime": "2020-12-06T04:10:52.0970000Z",
        "modificationState": "Created"
    },
    {
        "uniqueId": "Env30362",
        "field": "Currency",
        "value": "EUR",
        "modificationDateTime": "2020-12-13T04:10:55.0970000Z",
        "modificationState": "Changed"
    },
    {
        "uniqueId": "Env30362",
        "field": "Status",
        "value": "Active",
        "modificationDateTime": "2020-12-13T04:10:55.0970000Z",
        "modificationState": "Changed"
    },
    {
        "uniqueId": "Env30363",
        "field": "DateOfBirth",
        "value": "1980-12-01",
        "modificationDateTime": "2020-12-10T04:10:52.0970000Z",
        "modificationState": "Changed"
    },
        {
        "uniqueId": "Env30363",
        "field": "HiringReason",
        "value": "Growth",
        "modificationDateTime": "2020-12-10T04:10:52.0970000Z",
        "modificationState": "Changed"
    }
]

Я хотел бы отфильтровать и сгруппировать поля на основе uniqueId и modificationState, чтобы я мог создать новый JObject со всеми полями и значениями, связанными с созданием/изменением. Я пробовал разные подходы к Linq, но не нашел способа использовать несколько предложений where в IEnumerable из JToken

Желаемый результат:

{
"uniqueId": "Env30363",
"modificationState": "Created"
"finalProcessDate": "2020-12-01",
"modificationDateTime": "2020-12-06T04:10:52.0970000Z",
"natureOfContract": "Permanent",
"annualIncentiveCurrency" : "EUR"
}

{
"uniqueId": "Env30363",
"modificationState": "Changed"
"modificationDateTime": "2020-12-10T04:10:52.0970000Z",
"hiringReason": "growth",
"dateOfBirth" : "1980-12-01"
}

{
"uniqueId": "Env30362",
"modificationState": "Created",
"modificationDateTime": "2020-12-12T04:10:55.0970000Z",
"endDate": "2020-01-01",
"startDate" : "1999-01-01"
}

{
"uniqueId": "Env30362",
"modificationState": "Changed",
"modificationDateTime": "2020-12-13T04:10:55.0970000Z",
"currency" : "EUR",
"status": "Active"
}

Как я могу добиться этого с помощью NewtonSoft.Json?

Я пробовал разные подходы с Linq, но я не нашел способа использовать несколько предложений where в IEnumerable из JToken - тогда не могли бы вы отредактировать свой вопрос, включив минимальный воспроизводимый пример показывающий, что не работает ? Непонятно, как ввод должен преобразовываться в вывод, тем более что вывод без внешних скобок [ и ] даже не является правильно сформированным JSON.

dbc 14.12.2020 16:41
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
1
487
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На основании информации в вашем вопросе похоже, что вы хотите что-то вроде этого (я предполагаю, что С#, поскольку в вашем вопросе не указан язык):

JArray array = JArray.Parse(json);

var camel = new CamelCaseNamingStrategy();

JArray transformedArray = new JArray(
    array.Children<JObject>()
         .GroupBy(jo => new 
         { 
             UniqueId = (string)jo["uniqueId"], 
             ModificationState = (string)jo["modificationState"],
             ModificationDateTime = (DateTime)jo["modificationDateTime"]
         })
         .OrderBy(g => g.Key.ModificationDateTime)
         .ThenByDescending(g => g.Key.ModificationState)  // if same time, put Created before Changed
         .ThenBy(g => g.Key.UniqueId)
         .Select(g => new JObject(
             new JProperty("uniqueId", g.Key.UniqueId),
             new JProperty("modificationState", g.Key.ModificationState),
             new JProperty("modificationDateTime", g.Key.ModificationDateTime),
             g.Select(jo => new JProperty(camel.GetPropertyName((string)jo["field"], false), jo["value"]))
         ))
);

Это даст вам новый JArray из JObjects с новым форматом.

Вот рабочая демонстрация: https://dotnetfiddle.net/cT7F33

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