如何在杰克逊 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 文档,发现他们已经开始支持深度合并。但是我没有尝试使用它。
我正在使用 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 文档,发现他们已经开始支持深度合并。但是我没有尝试使用它。