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

如何使用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以类的无参实例字段值作为默认值判断标准,而非数据类型的原生默认值:

  1. 类注解配置:
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
class Night {
    int stars = 10;
    int moon = 1;
    // getter and setter for all fields
}
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:54:01