将两个JTokens合并为一个

时间:2016-06-10 20:24:15

标签: c# json json.net

如何将这两个JTokens合并为一个JToken。这听起来应该很简单,但无法绕过它。

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

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

感谢您的帮助!

这是我到目前为止所尝试的:

我首先将第一个对象分配给变量Jtoken pageOne然后,我尝试将其连接到第二个变量JToken allPages。我有一个循环,带回多个页面,每个页面有三个字段。最终目标是获取每个页面并创建一个包含其中所有页面的大J Token

类似的东西:

for (int page = 0; page <= recCount; page += 2000)
{
 //Get data
 pageOne = getJsonData();
 allPages.Concat(pageOne);
}
return allPages;

2 个答案:

答案 0 :(得分:6)

您可以使用JContainer.Merge(Object, JsonMergeSettings)将一个JObject合并到另一个 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. 上。请注意JsonMergeSettings.MergeArrayHandling可以控制数组的合并方式。从MergeArrayHandling Enumeration documentation开始,可能的合并选项是:

MergeArrayHandling.Concat

因此使用allPages进行合并如下,其中pageOneJContainer都是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; ):< / p>

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

给出:

Replace

使用{ "data": [ { "ID": "53a1838200401324eb1ec66562e9d77d", "name": "Private Approval Process: Draft Document CPL", "objCode": "ARVPTH" } ] } 合并时会给出:

JToken

如果您的变量属于JContainer类型,则需要将它们转换为null。 (不是容器的JSON原语不能合并。)

JsonMergeSettings.MergeNullValueHandling可根据需要控制是合并还是忽略]值。

答案 1 :(得分:0)

你可以像那样合并(或者如果你有它在数组或列表中,你可以通过查询建立一个linq组,例如通过ID属性,这同样有效)。

  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();