You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止Jackson ObjectReader覆盖已有数据?

解决Jackson ObjectReader更新时覆盖嵌套字段原有值的问题

问题核心:使用readerForUpdating更新已有对象时,Jackson默认会替换整个嵌套对象实例,而非合并字段。比如你传入仅包含fieldTypeA.valueB的JSON时,原有fieldTypeA.valueA会被置为null,因为新的FieldTypeA实例只设置了valueB,其他字段用默认值null。

解决方案1:给嵌套字段添加@JsonMerge注解

直接在需要合并的嵌套字段上标注@JsonMerge,告诉Jackson合并该字段的现有实例与JSON中的数据,而非替换:

import com.fasterxml.jackson.annotation.JsonMerge

data class Model(
    @JsonMerge
    val fieldTypeA: FieldTypeA? = null,
)

data class FieldTypeA(
    val valueA: String? = null,
    val valueB: String? = null,
)

修改后,执行readerForUpdating.readValue(jsonRequest)时,Jackson会将JSON中的valueB合并到已有的fieldTypeA实例上,保留原有valueA的值。

解决方案2:全局开启合并更新特性

如果不想逐个字段加注解,可以给ObjectMapper全局开启USE_MERGE_FOR_UPDATES特性,让所有readerForUpdating操作默认合并嵌套对象:

import com.fasterxml.jackson.databind.MapperFeature
import com.fasterxml.jackson.module.kotlin.KotlinModule
import com.fasterxml.jackson.databind.ObjectMapper

val customMapper = ObjectMapper()
    .registerModule(KotlinModule())
    .enable(MapperFeature.USE_MERGE_FOR_UPDATES)

val readerForUpdating = customMapper.readerForUpdating(existingEntity)

注意事项

如果JSON中明确将嵌套字段设为null(比如{"fieldTypeA": null}),原有值仍会被覆盖为null——这是明确的赋值操作,与"缺少字段"的场景不同。

内容的提问来源于stack exchange,提问作者maloney

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:50:20