JSON反序列化场景下如何忽略DTO类的字段默认值
JSON反序列化忽略DTO字段默认值解决方案
默认Jackson反序列化时会优先调用DTO类的无参构造方法,此时字段声明的初始值会被预先赋值,如果输入JSON中没有对应字段,就会保留该初始值。要实现JSON缺失字段时自动覆盖为null,可采用以下两种简便方案:
方案1:全局配置(无代码侵入,推荐)
直接修改ObjectMapper配置,全局生效,不需要改动任何DTO类代码,适合所有DTO都需要遵循该规则的场景:
import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.databind.ObjectMapper; // 配置ObjectMapper ObjectMapper objectMapper = new ObjectMapper(); // 核心配置:JSON中缺失的字段统一赋值为null,覆盖类的默认初始值 objectMapper.setDefaultSetterInfo(JsonSetter.Value.forMissing(null));
如果是SpringBoot项目,可直接将配置后的ObjectMapper注册为Bean,全局接管序列化/反序列化逻辑:
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setDefaultSetterInfo(JsonSetter.Value.forMissing(null)); return objectMapper; } }
方案2:单个类注解配置(局部生效)
如果只需要部分DTO遵循该规则,不想改动全局配置,可以配合Lombok注解实现,不需要手动编写全参构造器:
import com.fasterxml.jackson.annotation.JsonCreator; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; // 自动生成全参构造器并添加@JsonCreator注解 @AllArgsConstructor(onConstructor = @__(@JsonCreator)) @NoArgsConstructor public class Dto { private String name = "test"; }
该配置下Jackson会优先使用带@JsonCreator的全参构造反序列化,JSON中缺失的字段会自动赋值为null,覆盖类的初始值。
注意:如果没有使用Lombok,也可以手动给DTO添加带
@JsonCreator的全参构造,只是需要额外编写构造代码。
内容的提问来源于stack exchange,提问作者yaroslavTir
相关产品推荐
相关产品推荐

