Объединение двух массивов 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 };
Как я могу заставить его работать?
- Можно ли указать путь в атрибуте для сопоставления свойства в моем classе с дочерним свойством в моем JSON?
- JSON.net сериализуется непосредственно из oledbconnection
- .NET NewtonSoft JSON десериализует карту для другого имени свойства
- Удалить дескриптор объекта json в динамический объект с помощью Json.net
- Невозможно сериализовать словарь с помощью сложного ключа с помощью Json.net
- Json.Net добавляет $ id к объектам EF, несмотря на то, что PreserveReferencesHandling указывает на "None"
- Как преобразовать datatable в строку json с помощью json.net?
- Как использовать Json.NET для JSON-моделирования в проекте MVC5?
- JSON.net: как десериализовать без использования конструктора по умолчанию?
- Deserializing JSON, когда иногда массивы, а иногда и объекты
- Как игнорировать неизвестные значения enum во время десериализации json?
- Дезициализация свойств самореференции не работает
- Дессериализация данных JSON на C # с использованием JSON.NET
Используйте 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); } } } }