【问题标题】:How to merge two json documents in json.net?如何在 json.net 中合并两个 json 文档?
【发布时间】:2021-06-17 12:27:28
【问题描述】:

我不确定正确的术语,因为我对 json 不太了解。我有一个现有的以下固定格式的 json 字符串/对象(即所有项目都在根级别并且是直接的键/值对,尽管项目的数量可能会有所不同):

{
  "product_id": "1777",
  "license_key": "ECHOES-SILENCE-PATIENCE-AND-GRACE",
  "valid_for": "365",
  "status": "active",
  "times_activated_max": 1
}

我需要一种方法来添加传递给方法的不同模式/格式的 json 字符串。该对象可以是任何 json 格式。它将被添加到根目录。例如添加这个:

{
"name":"John",
"age":30,
"cars":["Ford", "BMW", "Fiat"]
}

..会变成这样:

{
  "product_id": "1777",
  "license_key": "ECHOES-SILENCE-PATIENCE-AND-GRACE",
  "valid_for": "365",
  "status": "active",
  "times_activated_max": 1
  "name":"John",
  "age":30,
  "cars":["Ford", "BMW", "Fiat"]
}

为此,我可以使用 Newtonsoft.Json。

我确实阅读了this,但无法将其映射到我的问题。

希望有人能帮忙

【问题讨论】:

  • 为什么不呢?这才是真正的答案。您发布的是两个对象。您在问如何将两个对象的属性合并为一个新对象。 JSON 文档可能是文本,但它包含的是数组和对象。 “合并”意味着找到一种方法来组合这些对象/数组并生成一个新的数组或对象。
  • 阅读documentation怎么样?
  • 看起来像 Merge two JTokens into one 和/或 How can I merge two JObject? 的副本,同意吗?

标签: c# json json.net


【解决方案1】:

JSON.NET 文档中专门有一篇文章:Merging JSON。您可以使用JObject.Merge 将两个不同的对象合并为一个:

JObject o1 = JObject.Parse(@"{
  'FirstName': 'John',
  'LastName': 'Smith',
  'Enabled': false,
  'Roles': [ 'User' ]
}");
JObject o2 = JObject.Parse(@"{
  'Enabled': true,
  'Roles': [ 'User', 'Admin' ]
}");

o1.Merge(o2, new JsonMergeSettings
{
    // union array values together to avoid duplicates
    MergeArrayHandling = MergeArrayHandling.Union
});

您发布的是两个对象。 JSON 文档可能是文本,但它包含的是数组和对象。 “合并”意味着找到一种方法来组合这些对象/数组并生成一个新的数组或对象。

Merge 由 JObject 和 JArray 的父级 JContainer 定义。这意味着您可以使用Merge 来合并数组和对象。

数组的另一种选择是使用Enumerable.Union 组合两个数组的内容,并创建一个新的:

var array1= JArray.Parse("[1,2,3]");
var array2= JArray.Parse("[3,4,5, \"a\"]");

var array3=new JArray(array1.Union(array2));

这将返回[1,2,3,4,5,"a"]

【讨论】:

  • 有没有办法自己写合并比较函数?我们有一个要合并的复杂对象的列表,但我们只关心它们的“Id”。不是索引位置?
【解决方案2】:

Json.net 使用 JObject 类型来表示任意 JSON 对象。这有一个方便的Merge 方法来组合两个 JObject。

简单地说:

string s1 = @"
{
  ""product_id"": ""1777"",
  ""license_key"": ""ECHOES-SILENCE-PATIENCE-AND-GRACE"",
  ""valid_for"": ""365"",
  ""status"": ""active"",
  ""times_activated_max"": 1
}";
string s2 = @"
{
  ""name"":""John"",
  ""age"":30,
  ""cars"":[""Ford"", ""BMW"", ""Fiat""]
}";

JObject o1 = JObject.Parse(s1);
JObject o2 = JObject.Parse(s2);

o1.Merge(o2);

Console.WriteLine(o1);

See it here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多