如何配置Jackson以忽略Java类中为null或空(empty)的字段

Jackson库提供了@JsonInclude注解和ObjectMapper配置选项,可以用来控制是否在JSON输出中包含null或空值的字段。

默认情况下,Jackson会包含所有字段,不论其值为何。

本教程将展示如何使用Include.NON_NULL来忽略null值字段,以及使用Include.NON_EMPTY来忽略空值字段。

添加依赖项

首先,在你的pom.xml文件中添加以下依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>LATEST_VERSION</version> <!-- 请替换为Maven中央仓库上的最新版本 -->
</dependency>

此依赖会自动引入jackson-corejackson-annotations

@JsonInclude 注解概览

@JsonInclude注解支持两种主要的配置值:

  • Include.NON_NULL: 只有非null的属性会被包含在JSON中。
  • Include.NON_EMPTY: 只有非空(非null且不为空字符串、集合等)的属性会被包含在JSON中。

该注解可以在属性级别或类级别使用,也可以全局配置ObjectMapper实例。

示例代码
1. 属性级别的@JsonInclude配置

我们可以通过在属性上添加@JsonInclude注解来指定个别字段的行为。

package net.javaguides.jackson.annotations;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

public class Employee {
    private int id;

    @JsonInclude(Include.NON_NULL)
    private String firstName;

    @JsonInclude(Include.NON_EMPTY)
    private String lastName;

    public Employee(int id, String firstName, String lastName) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    // Getters and setters...
}
2. 类级别的@JsonInclude配置

我们还可以通过在类上添加@JsonInclude注解来为整个类设置统一的行为。

package net.javaguides.jackson.annotations;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

@JsonInclude(Include.NON_NULL)
public class Employee {
    private int id;
    private String firstName;

    @JsonInclude(Include.NON_EMPTY)
    private String lastName;

    public Employee(int id, String firstName, String lastName) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    // Getters and setters...
}
3. 使用ObjectMapper全局配置

你也可以在ObjectMapper实例上全局地配置这一行为。请注意,如果你同时设置了Include.NON_NULLInclude.NON_EMPTY,后者将会覆盖前者。

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 或者使用 Include.NON_EMPTY
// mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
测试代码

这里是一个完整的测试示例,它演示了上述配置的效果:

package net.javaguides.jackson.annotations;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

public class JsonIncludeAnnotationTest {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(Include.NON_NULL); // 或者 NON_EMPTY
        mapper.enable(SerializationFeature.INDENT_OUTPUT);

        Employee employee = new Employee(10, null, "");
        String result = mapper.writeValueAsString(employee);

        System.out.println(result);
    }
}

运行上述代码后,如果firstNamenulllastName是空字符串,那么最终的JSON输出将只包含id字段。

注意:在最新的Jackson版本中,setSerializationInclusion方法已经被弃用,推荐使用setDefaultInclusionwriterWithDefaultPrettyPrinter().with(...). 例如:

ObjectMapper mapper = new ObjectMapper();
mapper.setDefaultInclusion(JsonInclude.Value.construct(Include.NON_NULL, Include.NON_EMPTY));

这将确保你的项目遵循最佳实践,并与未来的Jackson版本兼容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值