在 Java 和 Spring Boot 中使用 Jackson 忽略 Null 字段

Null 值在软件开发中经常出现,并且正确处理 null 价值观本身可以变成一门科学。 Jackson 是 Java 对象序列化和反序列化的事实上的库 - 一个常见的场景涉及序列化具有 null 领域.

在这个简短的教程中,我们将了解在使用 Jackson 序列化 POJO 时如何忽略空字段。

更改 ObjectMapper 设置

Jackson 的 ObjectMapper 是将对象映射到序列化值的中心 API。 当然,您可以通过各种标志来调整和自定义它的工作方式,其中之一是:

objectMapper.setSerializationInclusion(Include.NON_NULL);

使用此映射器进行序列化时,仅当属性为非空时才会包含这些属性。

这设置了标志 全球 对于任何被序列化的对象 objectMapper 实例。 如果您正在使用 Spring Boot,并且它所依赖的 ObjectMapper 未公开,则可以更改 application.properties 文件:

spring.jackson.default-property-inclusion = non_null

或者,如果您正在使用 application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

请注意: 使用旧版本的 Spring spring.jackson.serialization-inclusion=non_null 而不是 spring.jackson.default-property-inclusion=non_null.

或者,您可以剥离替换默认值 ObjectMapper 通过注册一个新的实例 @Primary @Bean命名 objectMapper(),它会覆盖默认实现并允许对在序列化和反序列化时默认使用的实例进行完全自定义:

@Bean
@Primary
public ObjectMapper objectMapper() {
    return new ObjectMapper()
      .setSerializationInclusion(JsonInclude.Include.NON_NULL);
}

本篇 @Bean 应该进入 任何文件 注释为 @Configuration 注解,并且通常位于专门的配置类或 Spring Boot 应用程序的主类中。

更改 Jackson2ObjectMapperBuilder 实例

春天使用 HttpMessageConverters 在 HTTP 消息和对象之间进行转换。 默认转换器是 ObjectMapperXmlMapper 通过实例化的实例 Jackson2ObjectMapperBuilder.

而不是手动提供主要 ObjectMapper (替换生成器提供的那个),您可以指示 Spring 如何建造 对象映射器。 这允许 Spring 执行其高级配置,而无需您篡改低级对象,同时仍可自定义其工作方式。 此外,您还可以自定义 XmlMapper 这种方式一口气。

要自定义构建器,您需要注册一个新的 @Bean of Jackson2ObjectMapperBuilderCustomizer type,它自定义并返回构建器:

@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
    return builder -> {
      builder.serializationInclusion(JsonInclude.Include.NON_NULL);
    }
}

@JsonInclude 注释

另一方面,我们可以使用注释作为低代码替代方案! 注释可以在类级别或方法级别应用:

@JsonInclude(JsonInclude.Include.NON_NULL)

这允许您仅自定义某些类,而不是对象映射器的全局行为。

查看我们的 Git 学习实践指南,其中包含最佳实践、行业认可的标准以及随附的备忘单。 停止谷歌搜索 Git 命令,实际上 学习 它!

请注意: 从 Jackson 2.0 开始,注释的值为 JsonInclude.Include.NON_NULL. 对于早期版本,请使用 include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude 在类级别

申请时 @JsonInclude 在类级别,注释扩展到所有的 getter 和 setter:

@Entity(name="property")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Property implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private String id;

    @Column(name="transaction_type")
    private TransactionType transactionType;

    @Column(name="property_type")
    private PropertyType propertyType;
    
    
}

任何具有 null 值不会被序列化。

@JsonInclude 在方法级别

或者,您可以在方法级别应用注释作为最精细的选项:

@Entity(name="property")
public class Property implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private String id;

    @Column(name="transaction_type")
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private TransactionType transactionType;

    @Column(name="property_type")
    private PropertyType propertyType;
    
    
}

在此代码段中 – 注释仅适用于 TransactionType 领域。

结论

在本指南中,您学习了如何使用 Java 和 Spring Boot 在 Jackson 中忽略 null 字段。 这可以通过替换底层隐式来全局实现 ObjectMapper 实例并自定义您注册的新主 bean 的行为。

或者,您可以自定义 Jackson2ObjectMapperBuilder 构建 ObjectMapper 为您的应用程序而不是替换已经构建的应用程序。 对于低代码解决方案 - 您可以更改 spring.jackson.default-property-inclusion 属性文件中的属性。

最后——你可以使用 @JsonInclude 类级别或方法级别的注释。

时间戳记:

更多来自 堆栈滥用