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

Jackson序列化:JsonInclude.NON_ABSENT无法忽略null值的问题求助

问题解决:Jackson序列化时无法忽略null字段的解决方案

问题原因

你使用Lombok的@Value注解生成不可变类,该注解会将所有字段设为final并生成全参构造器。通过@Builder构建ProductPart时,未指定payingInformation的情况下,构建器会传递null给构造器,导致该字段被显式赋值为null。虽然配置了@JsonInclude(JsonInclude.Include.NON_ABSENT),但在Lombok不可变类的场景下,Jackson对字段的处理逻辑可能导致注解未生效。

具体解决方案

方案1:改用NON_NULL注解

将类上的@JsonInclude(JsonInclude.Include.NON_ABSENT)替换为@JsonInclude(JsonInclude.Include.NON_NULL),或者直接在payingInformation字段上单独添加该注解:

@Builder
@Value
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ProductPart {
    @NonNull
    Long productId;
    @NonNull
    Integer offerId;
    @Builder.Default
    @NonNull
    ActivationPeriodPart activationPeriod = ActivationPeriodPart.builder().build();
    @Singular
    List<ValuePart> values;
    @Builder.Default
    @NonNull Date orderDateTime = new Date(1529897304000L);
    
    PayingInformationPart payingInformation;
}

NON_NULL会直接忽略所有值为null的字段,在Lombok不可变类场景下通常能直接生效。

方案2:用Optional包装字段

将payingInformation字段改为Optional<PayingInformationPart>类型,未设置该字段时其值为Optional.empty(),NON_ABSENT会自动忽略这种空的Optional:

@Builder
@Value
@JsonInclude(JsonInclude.Include.NON_ABSENT)
public class ProductPart {
    // 其他字段保持不变
    Optional<PayingInformationPart> payingInformation;
}

构建对象时,无需额外处理空值;若需要设置该字段,使用Optional.of(...)包装实例即可。

方案3:引入Jackson-Lombok模块

若项目未引入jackson-datatype-lombok依赖,Jackson可能无法正确识别Lombok生成的类结构,导致注解失效。添加以下Maven依赖:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-lombok</artifactId>
    <version>你的Jackson版本号</version>
</dependency>

同时在Jackson的ObjectMapper中注册该模块:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new LombokModule());

验证

修改后重新序列化目标对象,payingInformation字段将不再出现在序列化结果中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:16:33