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

类级别标注JsonInclude.Include.NON_NULL时如何序列化并保留null值?

解决思路与方案

这个问题很常见——因为你在类上标注的@JsonInclude(JsonInclude.Include.NON_NULL)就是明确告诉Jackson:序列化时要排除值为null的字段。要保留null字段,你可以根据自己的业务场景从以下几个方向调整:

1. 临时覆盖类级注解(仅本次日志序列化生效)

如果只是这次日志记录需要保留null字段,不想修改类的全局注解配置,最稳妥的方式是创建一个临时的ObjectMapper实例,单独设置序列化规则为Include.ALWAYS,这样会忽略类上的NON_NULL注解,仅对本次序列化生效:

// 创建独立的ObjectMapper,避免影响全局配置
ObjectMapper logMapper = new ObjectMapper();
logMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);

try {
    String employeeJson = logMapper.writeValueAsString(yourEmployeeObject);
    log.info("Employee 序列化结果: {}", employeeJson);
} catch (JsonProcessingException e) {
    log.error("序列化失败", e);
}

2. 修改类/字段级注解(全局生效)

如果你的业务场景需要这个类的所有序列化操作都保留null字段,直接修改类上的注解即可:

// 将类级注解改为ALWAYS,所有null字段都会被序列化
@JsonInclude(JsonInclude.Include.ALWAYS)
public class Employee {
    private String name;
    private Integer age;
    // ... getter/setter 方法
}

如果只是个别字段需要保留null,其他字段仍然排除null,可以给特定字段单独加注解(字段注解优先级高于类注解):

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Employee {
    private String name; // null时会被排除
    private Integer age; // null时会被排除

    // 这个字段即使为null也会被序列化
    @JsonInclude(JsonInclude.Include.ALWAYS)
    private String address;
}

3. 检查全局ObjectMapper配置

如果你的应用(比如Spring Boot项目)有全局的Jackson配置,要确认是否全局设置了NON_NULL(虽然类级注解优先级高于全局配置,但还是要排查潜在影响):

比如Spring Boot的application.properties中如果有以下配置:

spring.jackson.default-property-inclusion=non_null

如果需要全局保留null字段,可以修改为:

spring.jackson.default-property-inclusion=always

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:46:52