如何配置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-core
和jackson-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_NULL
和Include.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);
}
}
运行上述代码后,如果firstName
是null
而lastName
是空字符串,那么最终的JSON输出将只包含id
字段。
注意:在最新的Jackson版本中,setSerializationInclusion
方法已经被弃用,推荐使用setDefaultInclusion
或writerWithDefaultPrettyPrinter().with(...)
. 例如:
ObjectMapper mapper = new ObjectMapper();
mapper.setDefaultInclusion(JsonInclude.Value.construct(Include.NON_NULL, Include.NON_EMPTY));
这将确保你的项目遵循最佳实践,并与未来的Jackson版本兼容。