Объединение двух массивов Json.NET путем конкатенации содержащихся элементов

У меня есть два JToken , которые представляют массивы JSON объектов, и я хотел бы объединить их. 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 .

Это доступно, начиная с версии 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); } } } } 
  • Как десериализовать данные JSON?
  • Удаление десериализации JSON в объект с помощью Json.NET
  • как десериализовать JSON в IEnumerable с помощью Newtonsoft JSON.NET
  • json.net: указать конвертер для ключей словаря
  • Json.NET: десериализация вложенных словарей
  • Deserialize json с известными и неизвестными полями
  • Серийный объект Json.NET с корневым именем
  • JSON.NET - как десериализовать сборку интерфейсных экземпляров?
  • Как установить Json.Net в качестве сериализатора по умолчанию для службы WCF REST
  • Как реализовать пользовательский JsonConverter в JSON.NET для десериализации списка объектов базового classа?
  • Как десериализовать дочерний объект с динамическими (числовыми) именами клавиш?
  • Давайте будем гением компьютера.