首页 > 解决方案 > 使用 MergeArrayHandling.Merge 合并数组 json。如何在 newtonsoft 库中定义索引

问题描述

让我们先取2个数组:

[ {"name": "a", "innerArray": [{"first": 1, "second": 1}, {"first": 2, "second": 2},]}, {"name" : "b", "innerArray": [{"first": 1, "second": 1}, {"first": 2, "second": 2},]} ]

第二

[ {"name": "a", "innerArray": [{"first": 1, "second": 11}, {"first": 3, "second": 22},]}, {"name" : "c", "innerArray": [{"first": 1, "second": 1}, {"first": 2, "second": 2},]} ]

我想合并它们有​​这样的输出

[ {"name": "a", "innerArray": [{"first": 1, "second": 11}, {"first": 2, "second": 2}, {"first": 3, “第二”:22}]},{“名称”:“b”,“innerArray”:[{“第一”:1,“第二”:1},{“第一”:2,“第二”:2} ,]}, {"name": "c", "innerArray": [{"first": 1, "second": 1}, {"first": 2, "second": 2},]} ]

这可能使用 json.net 吗?我知道有 MergeArrayHandling 选项可以设置为 MergeArrayHandling.Merge ,在描述中定义为“将数组项合并在一起,按索引匹配”。但是我没有找到任何例子。

每当我尝试合并它们时,结果只是用新值替换旧值。

JArray o1 = JArray.Parse(@"first array")
JArray o2 = JArray.Parse(@"second array")

o1.Merge(o2, new JsonMergeSettings
{
MergeArrayHandling = MergeArrayHandling.Merge
});

string json = o1.ToString();

标签: arraysmergejson.netarray-merge

解决方案


正如它所说,合并选项基于数组索引工作,因此,例如,如果您有一个数组[1,2,3][4]选择MergeArrayHandling.Merge选项,您将获得结果[4,2,3],因为两者共享一个index 0,因此来自传入的值将接管源。如果没有共享索引,则源将保留,这解释了2,3结果数组中的 。

要回答您的具体问题是和否,您想要的结果类似于通过 a unionorconcat选项实现的结果,但是这些不起作用,因为它们不会像这样做那样通过对象递归merge,实现这一目标的唯一方法是自己分解 Json 并进行单独的合并,这更详尽但在技术上是可行的。


推荐阅读