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

@JsonInclude(JsonInclude.Include.NON_NULL) 不生效问题求助

解决@JsonInclude(NON_NULL)注解不生效的问题

以下是针对你的问题的排查和解决方法:

1. 检查父类BaseClass的注解配置

如果父类BaseClass上标注了@JsonInclude(JsonInclude.Include.ALWAYS)或其他与NON_NULL冲突的注解,子类A的类级别注解会被覆盖。

解决办法:

  • 修改BaseClass的注解为NON_NULL,或者在子类的C字段上单独添加字段级别的@JsonInclude注解(字段级别优先级高于类级别和父类配置):
@JsonInclude(JsonInclude.Include.NON_NULL)
class A extends BaseClass {
    private String B;
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private C c; // 修正原代码中`private C;`的语法错误

    // 必须提供对应的getter/setter方法,Jackson默认依赖这些方法识别字段
    public String getB() { return B; }
    public void setB(String B) { this.B = B; }
    public C getC() { return c; }
    public void setC(C c) { this.c = c; }
}

2. 排查ObjectMapper的全局序列化配置

如果代码中对ObjectMapper设置了全局序列化策略,比如:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);

这种全局配置会强制序列化所有字段,覆盖类/字段级别的NON_NULL注解。

解决办法:
将全局配置修改为NON_NULL,或者移除全局配置,让类/字段级别的注解生效:

objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

3. 确保字段定义与getter/setter合法

原代码中private C;属于语法错误,正确的字段定义应为private C c;,并且必须为该字段提供对应的getter和setter方法——Jackson默认通过getter方法识别可序列化的字段,缺少这些方法可能导致注解逻辑失效。

4. 可选:用@JsonProperty明确字段映射

如果JSON中的键与类字段名存在大小写或命名差异(比如JSON中的C对应类中的c),可以添加@JsonProperty注解明确映射,同时配合NON_NULL注解:

@JsonProperty("C")
@JsonInclude(JsonInclude.Include.NON_NULL)
private C c;

验证:当A对象的c字段为null时,序列化后的JSON将只包含"B":"xyz",不会出现"C":null字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:12:34