Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays JArray中的筛选器和组属性_Arrays_Json_Json.net - Fatal编程技术网

Arrays JArray中的筛选器和组属性

Arrays JArray中的筛选器和组属性,arrays,json,json.net,Arrays,Json,Json.net,我从API接收到一个数组,如下所示: [ { "uniqueId": "Env30362", "field": "StartDate", "value": "1999-01-01", "modificationDateTime": "2020-12-12T04:10:55.09

我从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尝试了不同的方法,但我没有找到一种方法在
JToken的
IEnumerable
上使用多个
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如何实现这一点?

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

JArray数组=JArray.Parse(json); var camel=新的CamelCaseNamingStrategy(); JArray transformedArray=新JArray( array.Children() .GroupBy(jo=>new { UniqueId=(字符串)jo[“UniqueId”], ModificationState=(字符串)jo[“ModificationState”], ModificationDateTime=(DateTime)jo[“ModificationDateTime”] }) .OrderBy(g=>g.Key.ModificationDateTime) .ThenByDescending(g=>g.Key.ModificationState)//如果是同一时间,则在更改之前创建put .ThenBy(g=>g.Key.UniqueId) .选择(g=>newjobject( 新JProperty(“uniqueId”,g.Key.uniqueId), 新的JProperty(“modificationState”,g.Key.modificationState), 新的JProperty(“modificationDateTime”,g.Key.modificationDateTime), g、 选择(jo=>newJProperty(camel.GetPropertyName((string)jo[“field”],false),jo[“value”])) )) );
这将为您提供具有新格式的
JObjects
的新
JArray


这是一个有效的演示:

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

JArray数组=JArray.Parse(json); var camel=新的CamelCaseNamingStrategy(); JArray transformedArray=新JArray( array.Children() .GroupBy(jo=>new { UniqueId=(字符串)jo[“UniqueId”], ModificationState=(字符串)jo[“ModificationState”], ModificationDateTime=(DateTime)jo[“ModificationDateTime”] }) .OrderBy(g=>g.Key.ModificationDateTime) .ThenByDescending(g=>g.Key.ModificationState)//如果是同一时间,则在更改之前创建put .ThenBy(g=>g.Key.UniqueId) .选择(g=>newjobject( 新JProperty(“uniqueId”,g.Key.uniqueId), 新的JProperty(“modificationState”,g.Key.modificationState), 新的JProperty(“modificationDateTime”,g.Key.modificationDateTime), g、 选择(jo=>newJProperty(camel.GetPropertyName((string)jo[“field”],false),jo[“value”])) )) ); 这将为您提供具有新格式的
JObjects
的新
JArray

这里是一个有效的演示:

我已经尝试了使用Linq的不同方法,但我还没有找到一种在JToken的IEnumerable上使用多个where子句的方法-那么您能否请您的问题包括一个显示哪些不起作用的方法?目前还不清楚输入应该如何转换为输出,特别是因为输出缺少外部的
[
]
括号,甚至不是格式良好的JSON。我尝试过使用Linq的不同方法,但我还没有找到一种在JToken的IEnumerable上使用多个where子句的方法-那么你能不能请你的问题包括一个显示哪些不起作用的方法?目前还不清楚输入应该如何转换为输出,特别是因为缺少外部括号的输出甚至不是格式良好的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"]))
         ))
);