使用 MergeArrayHandling.Merge 合并数组 json。如何在 newtonsoft 库中定义索引

问题描述 投票:0回答:2

我们取 2 个数组 第一:

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

第二个

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

我想将它们合并成这样的输出

[ {“名称”:“a”,“innerArray”:[{“第一”:1,“第二”:11},{“第一”: 2,“第二”:2},{“第一”:3,“第二”:22}]},{“名称”:“b”, “innerArray”:[{“第一”:1,“第二”:1},{“第一”:2,“第二”: 2},]}, {"name": "c", "innerArray": [{"first": 1, "second": 1}, {“第一”:2,“第二”: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();
arrays merge json.net array-merge
2个回答
1
投票

合并选项根据数组索引工作,例如,如果您有一个数组

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

要回答您的特定问题是和否您想要的结果类似于通过

union
concat
选项可以实现的结果,但是这些不起作用,因为它们不会像
merge这样的对象递归
是的,实现这一目标的唯一方法是自己分解 Json 并进行单独的合并,这更详尽但在技术上是可行的。


0
投票

你做的一切都是正确的,不需要任何自定义逻辑。 正如您所说,您需要做的是指定一个索引,这很容易: 假设你有这个:

{
   "abc": "123",
   "testArray":
   [
      { "One": 1 },
      { "Two": 2 },
      { "Three" 3 }
   ]
}

而您想将第二个元素从

{ "Two": 2 }
更新为
{ "Ten": 10 }
您所要做的就是像这样提供第二个数组:

{
   "testArray":
   [
      {  },
      { "Ten": 10 }
   ]
}

总结:对于合并操作,您需要提供完整路径(这就是更新请求中有

testArray
的原因)并通过添加尽可能多的空索引来指定数组索引
{}
您需要跳过的索引

© www.soinside.com 2019 - 2024. All rights reserved.