Jackson 实体转 JSON 为 NULL 或者为空不参加序列化
为什么要从 JSON 反序列化成实体对象?
在进行 web 开发过程中,前后端数据传输离不开 JSON 字符串。服务器需要将实体对象转成 JSON 字符串返回给前端,而前端也需要将 JSON 字符串转成实体对象进行传入后端。Jackson 可以方便的实现该过程。
实现实体转 JSON
基础转化
首先需要在 pom.xml 中加入 Jackson 相关依赖,例如:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
然后我们可以编写一个实体类:
public class User {
private String name;
private int age;
// 省略 getter 和 setter 方法
}
如果需要将该实体转为 JSON 字符串,可以使用以下代码:
User user = new User();
user.setName("Alice");
user.setAge(18);
ObjectMapper mapper = new ObjectMapper();
String jsonStr = mapper.writeValueAsString(user);
这样就可以得到如下的 JSON 字符串:
{
"name": "Alice",
"age": 18
}
过滤为空的属性
有些情况下,我们会遇到需要过滤为空的属性的需求。这时我们需要使用 Jackson 提供的注解 @JsonInclude,其提供了 4 种策略:
- Include.ALWAYS:默认策略,序列化时包括 NULL 和空字段。
- Include.NON_NULL:只有非 NULL 的属性才会被序列化。
- Include.NON_EMPTY:非 NULL 且不为空(如空集合、空数组)的字段才会被序列化。
- Include.USE_DEFAULTS:只有属性的值为 primitive 数组(如 int[])时才会被序列化。
示例代码:
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
private String name;
private Integer age;
// 省略 getter 和 setter 方法
}
User user = new User();
user.setName("Bob");
ObjectMapper mapper = new ObjectMapper();
String jsonStr = mapper.writeValueAsString(user);
输出结果为:
{
"name": "Bob"
}
注意事项
- 使用 @JsonInclude 时需要注意,其只针对于返回 JSON 或 XML 数据格式的场景,对于返回其他数据格式,@JsonInclude 将不起作用。
- 将一些字段排除或者设置为 NULL 时,可以使用注解 @JsonIgnore 和 @JsonProperty 来达到目的。
示例演示
下面是另一个示例,演示如何使用 @JsonInclude.Include.NON_EMPTY 策略来忽略空属性。
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class User2 {
private String name;
private int age;
private List<String> hobbies;
// 省略 getter 和 setter 方法
}
User2 user = new User2();
user.setName("");
user.setAge(0);
user.setHobbies(new ArrayList<>());
ObjectMapper mapper = new ObjectMapper();
String jsonStr = mapper.writeValueAsString(user);
输出结果为:
{}
在该示例中,name 和 age 属性为空,hobbies 属性是一个空的 List。由于使用了 @JsonInclude.Include.NON_EMPTY 策略,这些空的属性都被过滤掉了,最终得到的结果是一个空的 JSON 对象。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jackson 实体转json 为NULL或者为空不参加序列化(实例讲解) - Python技术站