如何使用Jackson不序列化POJO中自定义初始化默认值,仅序列化修改后的字段
方案1:字段级自定义值过滤(适合字段初始值不统一的场景)
Jackson 2.9+ 版本支持@JsonInclude的CUSTOM规则,搭配valueFilter参数即可实现自定义值的序列化过滤逻辑,示例代码如下:
import com.fasterxml.jackson.annotation.JsonInclude; class Night { // 配置自定义过滤规则:值等于10时不序列化 @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = StarsDefaultFilter.class) int stars = 10; // getter and setter for stars // 过滤逻辑类:equals返回true时对应字段会被排除序列化 static class StarsDefaultFilter { @Override public boolean equals(Object obj) { if (!(obj instanceof Integer)) return false; // 值等于初始值10时触发过滤 return (Integer) obj == 10; } } }
该方案无需修改全局序列化配置,仅需在对应字段加注解即可,侵入性极低。
方案2:类级默认值基准过滤(适合大量字段需要统一按无参实例初始值过滤的场景)
如果你的POJO有大量字段需要以无参构造创建的实例的字段值作为默认过滤基准,可以直接在类上加@JsonInclude(JsonInclude.Include.NON_DEFAULT),同时额外配置ObjectMapper的规则,即可让Jackson以类的无参实例字段值作为默认值判断标准,而非数据类型的原生默认值:
- 类注解配置:
@JsonInclude(JsonInclude.Include.NON_DEFAULT) class Night { int stars = 10; int moon = 1; // getter and setter for all fields }
- ObjectMapper配置:
import com.fasterxml.jackson.databind.ObjectMapper; ObjectMapper mapper = new ObjectMapper(); // 配置NON_DEFAULT规则以类无参实例的字段值为判断基准 mapper.configOverride(Night.class) .setIncludeAsDefault(JsonInclude.Value.construct(JsonInclude.Include.NON_DEFAULT, null));
该方案不需要为每个字段单独加注解,适合字段多、初始值都定义在无参构造逻辑里的场景。
两种方案均兼容Jackson 2.13版本,无需编写完整的自定义序列化器即可实现需求。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

