【问题标题】:Merge two JTokens into one将两个 JToken 合并为一个
【发布时间】:2016-06-10 20:24:15
【问题描述】:

如何将这两个 JToken 合并为一个 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。我有一个循环,可以带回多个页面,每个页面包含三个字段。最终目标是抓取每个页面并创建一个包含所有页面的大 JToken

类似这样的:

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

【问题讨论】:

  • 创建 JToken[] 数组怎么样?
  • 您为实现它付出了哪些努力,请提供您迄今为止所做的示例。

标签: c# json json.net


【解决方案1】:

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

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. 

因此使用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;

给予:

{
  "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。 (不能合并非容器的 JSON 基元。)

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

【讨论】:

  • 听起来不错!我真正需要的是Concat。你会怎么写?会不会是这样的:object1.Concat(object2);
  • @JoseStack - 添加了一个示例调用。
  • 出于某种原因 JContainer allPages; allPages.**** 不会给我合并选项...我错过了什么吗?
  • @JoseStack - 注意在Json.NET 6.0 Release 4Json.NET 中添加了合并
  • 它按预期工作!我的版本也过时了。感谢大家的帮助!
【解决方案2】:

你可以像这样合并它(或者如果你把它放在一个数组或列表中,你可以通过查询例如在 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();

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2014-04-01
    • 2017-08-02
    • 2017-10-22
    • 2012-11-19
    • 2012-08-16
    相关资源
    最近更新 更多