Как я могу объединить два объекта JObject?

У меня есть первый json:

{ "data": [{ "id": "id1", "field": "field1" }], "paging": { "prev": "link1", } } 

и второй:

 { "data": [{ "id": "id2", "field": "field2" }], "paging": { "prev": "link2", } } 

и я хочу объединить / объединить два массива данных, например:

 { "data": [{ "id": "id1", "field": "field1" }, { "id": "id2", "field": "field2" }] } 

(Сейчас я не забочусь о paging ).

Как я могу сделать это быстро и легко? Это моя попытка:

 var final = JsonConvert.SerializeObject(new { data = json1["data"].Union(json2["data"]) }, Newtonsoft.Json.Formatting.Indented).ToString(); 

но возникает исключение: 'Newtonsoft.Json.Linq.JArray' does not contains a definition of 'Union'

 JArray dataOfJson1=json1.SelectToken("data"); JArray dataofJson2=json2.SelectToken("data"); foreach(JObject innerData in dataofJson2) { dataOfJson1.Add(innerData); } 

Newtonsoft.Json теперь поддерживает слияние объектов:
http://antix.co.uk/Blog/Merging-objects-using-JSON.NET

 var dataObject1 = JObject.Parse(@"{ ""data"": [{ ""id"": ""id1"", ""field"": ""field1"" }], ""paging"": { ""prev"": ""link1"", } }"); var dataObject2 = JObject.Parse(@"{ ""data"": [{ ""id"": ""id2"", ""field"": ""field2"" }], ""paging"": { ""prev"": ""link2"", } }"); var mergeSettings = new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union }; // method 1 (dataObject1.SelectToken("data") as JArray).Merge(dataObject2.SelectToken("data"), mergeSettings); // method 2 //dataObject1.Merge(dataObject2, mergeSettings); var mergedArray = dataObject1.SelectToken("data") as JArray; Console.WriteLine(mergedArray.ToString(Formatting.None)); 

(проверено с помощью компилятора мозга;))

Возможным решением может быть:

 class Container { public List data{get;set;} } class IdField { public string id{get;set;} public string field{get;set;} } string s1 = "{ \"data\": [{ \"id\": \"id1\", \"field\": \"field1\" }], \"paging\": { \"prev\": \"link1\", } }"; string s2 = "{ \"data\": [{ \"id\": \"id2\", \"field\": \"field2\" }], \"paging\": { \"prev\": \"link2\", } }"; var d1 = JsonConvert.DeserializeObject(s1); var d2 = JsonConvert.DeserializeObject(s2); d1.data.AddRange(d2.data); var result = JsonConvert.SerializeObject(d1); 

Для тех, кто (как я), не может использовать новую библиотеку JSON.net. Следующий метод – это то, что я использую.

 public static JObject mergeJsonObjects(List objects) { JObject json = new JObject(); foreach(JObject JSONObject in objects) { foreach(var property in JSONObject) { string name = property.Key; JToken value = property.Value; json.Add(property.Key, property.Value); } } return json; } 

Метод принимает список JObjects и возвращает один JObject, simpel и эффективный.

  • Можете ли вы определить, был ли объект, десериализованный объект, отсутствием поля с classом JsonConvert в Json.NET
  • Удаление десериализации JSON в .NET-объект с использованием Newtonsoft (или LINQ to JSON, возможно?)
  • Использование преобразователей Json.NET для десериализации свойств
  • Могу ли я сериализовать вложенные свойства в мой class за одну операцию с помощью Json.net?
  • Как изменить имена свойств при сериализации с помощью Json.net?
  • JSON.Net: принудительная сериализация всех частных полей и всех полей в подclassах
  • Десериализация JSON с использованием JSon.NET с динамическими данными
  • Разбор JSON в C #
  • Как игнорировать свойство в classе, если null, используя json.net
  • Как получить json.net для сериализации членов classа, полученных из List ?
  • Как я могу получить список ключей от Json.NET?
  • Давайте будем гением компьютера.