简体   繁体   English

将两个 JToken 合二为一

[英]Merge two JTokens into one

How can I merge these two JTokens into one single JToken.如何将这两个 JToken 合并为一个 JToken。 This sounds like it should be simple, but can't get my way around it.这听起来应该很简单,但无法解决它。

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

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

Thanks for the help!感谢您的帮助!

This is what I have tried so far:这是我迄今为止尝试过的:

I started by assigning the first object to a variable Jtoken pageOne then, I tried concatenating it into a second variable JToken allPages .我首先将第一个对象分配给变量Jtoken pageOne然后,我尝试将它连接到第二个变量JToken allPages I have a loop that brings back multiple pages each with three fields.我有一个循环,可以带回多个页面,每个页面包含三个字段。 The final goal is to grab each page and create a big J Token with all of the pages in it.最终目标是抓取每个页面并创建一个包含所有页面的大 J Token

something like this:像这样:

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

You can use JContainer.Merge(Object, JsonMergeSettings) to merge one JObject onto another.您可以使用JContainer.Merge(Object, JsonMergeSettings)将一个JObject合并到另一个上。 Note that JsonMergeSettings.MergeArrayHandling gives control over how arrays are merged.请注意, JsonMergeSettings.MergeArrayHandling控制数组的合并方式。 From the MergeArrayHandling Enumeration documentation , the possible merge options are:MergeArrayHandling Enumeration 文档中,可能的合并选项是:

 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 ):因此使用MergeArrayHandling.Concat合并如下,其中allPagespageOne都是JContainer类型(或子类,例如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:使用Replace合并时:

{
  "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 .如果您的变量是JToken类型,您需要将它们转换为JContainer (JSON primitives that are not containers cannot be merged.) (不能合并不是容器的 JSON 原语。)

JsonMergeSettings.MergeNullValueHandling gives control over whether to merge or ignore null values, as required. JsonMergeSettings.MergeNullValueHandling根据需要控制是合并还是忽略null值。

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).你可以像这样合并它(或者如果你把它放在一个数组或列表中,你可以通过查询例如 ID 属性来创建一个 linq 组,这同样有效)。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM