通过连接包含的元素合并两个Json.NET数组

我有两个代表JSON对象数组的JToken ,我想合并它们。 JToken有一个方法Concat但是当我尝试使用它时它会产生null

 Action Ok = (x) => { Debug.WriteLine(x); /* outputs [ { "id": 1, }, { "id": 2, } ] */ x = (x).Concat(x) as JToken; Debug.WriteLine(x); // null }; 

我怎样才能使它工作?

JContainer.Merge()MergeArrayHandling.Concat一起MergeArrayHandling.Concat

从Json.NET 6 Release 4开始提供。 因此,如果您的数组位于JContainer (例如JObject )中,这是一个简单而强大的解决方案。

例:

 JObject o1 = JObject.Parse(@"{ 'FirstName': 'John', 'LastName': 'Smith', 'Enabled': false, 'Roles': [ 'User' ] }"); JObject o2 = JObject.Parse(@"{ 'Enabled': true, 'Roles': [ 'Operator', 'Admin' ] }"); o1.Merge(o2, new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Concat }); string json = o1.ToString(); // { // "FirstName": "John", // "LastName": "Smith", // "Enabled": true, // "Roles": [ // "User", // "Operator", // "Admin" // ] // } 
 JToken.FromObject(x.Concat(x)) 

我需要同样的,这就是我想出的

https://github.com/MrAntix/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Linq/MergeExtensions.cs

 public static void MergeInto( this JContainer left, JToken right, MergeOptions options) { foreach (var rightChild in right.Children()) { var rightChildProperty = rightChild; var leftPropertyValue = left.SelectToken(rightChildProperty.Name); if (leftPropertyValue == null) { // no matching property, just add left.Add(rightChild); } else { var leftProperty = (JProperty) leftPropertyValue.Parent; var leftArray = leftPropertyValue as JArray; var rightArray = rightChildProperty.Value as JArray; if (leftArray != null && rightArray != null) { switch (options.ArrayHandling) { case MergeOptionArrayHandling.Concat: foreach (var rightValue in rightArray) { leftArray.Add(rightValue); } break; case MergeOptionArrayHandling.Overwrite: leftProperty.Value = rightChildProperty.Value; break; } } else { var leftObject = leftPropertyValue as JObject; if (leftObject == null) { // replace value leftProperty.Value = rightChildProperty.Value; } else // recurse object MergeInto(leftObject, rightChildProperty.Value, options); } } } }