@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
相关产品推荐
相关产品推荐

