如何在杰克逊 2 中进行深度合并 JSON?

How to do deep merge JSON in jackson 2?

我正在使用 Jersey 和 Jackson2 开发 Restful API。我们在开发 PUT 方法时遇到了问题。我们的 PUT 方法有点像 PATCH 方法。它只会更新请求正文中收到的属性。

我正在使用 ObjectMapper.readerForUpdating() 方法进行对象合并。但是这种方法只支持一级合并。例如:我有一个已存在的 JSON 对象

{
  "a": "this is a",
  "b": "this is b",
  "c": {
    "x": 1,
    "y": 2
  }
}

然后我收到一个 JSON 对象喜欢

{
  "a": "this is a new a",
  "c": {
    "x": 3
  }
}

我希望合并后的对象应该是这样的:

{
  "a": "this is a new a",
  "b": "this is b",
  "c": {
    "x": 3,
    "y": 2
  }
}

但是结果是

{
  "a": "this is a new a",
  "b": "this is b",
  "c": {
    "x": 3,
    "y": null
  }
}

一级属性合并正确。但是对于深层次来说,它是在做对象替换。有没有办法做深度合并?

此时,您必须自己遍历 JSON 棵树 (JsonNode) 来手动更新属性。可能有基于 Jackson 的扩展库为此提供支持,但核心 Jackson 数据绑定只有 "shallow" 合并单个(根 JSON 对象)级别。

我正在浏览 jackson-databind( com.fasterxml.jackson.core) v 2.11 的@JsonMerge 文档,发现他们已经开始支持深度合并。但是我没有尝试使用它。