Merge two JTokens into one

You can use JContainer.Merge(Object, JsonMergeSettings) to merge one JObject onto another. Note that JsonMergeSettings.MergeArrayHandling gives control over how arrays are merged. From the MergeArrayHandling Enumeration documentation, the possible merge options are:

Concat   0   Concatenate arrays.
Union    1   Union arrays, skipping items that already exist.
Replace  2   Replace all array items.
Merge    3   Merge array items together, matched by index. 

Thus merging using MergeArrayHandling.Concat as follows, where allPages and pageOne are both of type JContainer (or a subclass, such as JObject):

JContainer allPages = null;
var settings = new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Concat };
for (int page = 0; page <= recCount; page += 2000)
{
    //Get data
    var pageOne = (JContainer)getJsonData(page);
    if (allPages == null)
        allPages = pageOne;
    else
        allPages.Merge(pageOne, settings);
}
return allPages;

gives:

{
  "data": [
    {
      "ID": "53a1862000404a304942546b35519ba3",
      "name": "Private Approval Process: Draft Document CPL",
      "objCode": "ARVPTH"
    },
    {
      "ID": "53a1838200401324eb1ec66562e9d77d",
      "name": "Private Approval Process: Draft Document CPL",
      "objCode": "ARVPTH"
    }
  ]
}

While merging using Replace gives:

{
  "data": [
    {
      "ID": "53a1838200401324eb1ec66562e9d77d",
      "name": "Private Approval Process: Draft Document CPL",
      "objCode": "ARVPTH"
    }
  ]
}

If your variables are of type JToken you will need to cast them to JContainer. (JSON primitives that are not containers cannot be merged.)

JsonMergeSettings.MergeNullValueHandling gives control over whether to merge or ignore null values, as required.


You could merge it like that (or if you had it had it in an array or list you could make a linq group by query for example over the ID property, that would be likewise effective).

  var data1 =  JObject.Parse(@"{
           'data':[
          {
             'ID':'53a1862000404a304942546b35519ba3',
              'name':'Private Approval Process: Draft Document CPL',
              'objCode':'ARVPTH'
          }]
        }");

        var data2 = JObject.Parse(@"{
           'data':[
          {
             'ID':'53a1862000404a304942546b35519ba3',
              'name':'Private Approval Process: Draft Document CPL',
              'objCode':'ARVPTH'
          }]
        }");

        data1.Merge(data2, new JsonMergeSettings
        {
           MergeArrayHandling = MergeArrayHandling.Union
        });

        string json = data1.ToString();