Я получаю массив из 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?
На основании информации в вашем вопросе похоже, что вы хотите что-то вроде этого (я предполагаю, что С#, поскольку в вашем вопросе не указан язык):
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
Я пробовал разные подходы с Linq, но я не нашел способа использовать несколько предложений where в IEnumerable из JToken - тогда не могли бы вы отредактировать свой вопрос, включив минимальный воспроизводимый пример показывающий, что не работает ? Непонятно, как ввод должен преобразовываться в вывод, тем более что вывод без внешних скобок
[
и]
даже не является правильно сформированным JSON.