【问题标题】:Filter and group properties from JArray从 JArray 过滤和分组属性
【发布时间】:2020-12-14 15:14:55
【问题描述】:

我从这样的 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"
    }
]

我想根据uniqueIdmodificationState 对字段进行过滤和分组,以便我可以创建一个新的JObject,其中包含与创建/更改相关的所有字段和值。我用 Linq 尝试了不同的方法,但我还没有找到在 IEnumerableJToken 上使用多个 where 子句的方法

期望的输出:

{
"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 尝试了不同的方法,但我还没有找到在 JToken 的 IEnumerable 上使用多个 where 子句的方法 - 那么你能edit你的问题吗包括minimal reproducible example 显示什么不起作用?目前尚不清楚输入应该如何转换为输出,特别是因为缺少外部 [] 括号的输出甚至不是格式正确的 JSON。

标签: arrays json json.net


【解决方案1】:

根据您问题中的信息,您似乎想要这样的东西(我假设 C#,因为您的问题没有指定语言):

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

这将为您提供具有新格式的 JObjects 的新 JArray

这是一个工作演示:https://dotnetfiddle.net/cT7F33

【讨论】:

    猜你喜欢
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 2016-08-10
    相关资源
    最近更新 更多