前言
前面介绍了Jackson可以隐藏指定的字段,不管那个字段有没有值;
实际场景中,我们还会用到的就是隐藏值为NULL的字段;
本篇就来介绍下隐藏NULL属性值的多种方法;
下面这三种方法由上到下,覆盖范围逐渐扩大;
目录
- 字段加注解
- 类加注解
- 全局隐藏
- 相关配置
正文
1. 字段加注解
注解: @JsonInclude
只针对特定的字段,这种方式的颗粒度更细,更加灵活;
下面看一个例子,实体类User如下所示:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String username;
@JsonInclude(value = JsonInclude.Include.NON_NULL)
public String nickname;
}
这里我们在字段nickname上加了注解@JsonInclude(value = JsonInclude.Include.NON_NULL)
,表明当nickname值不为NULL时,才会进行处理;
现在我们创建一个空的User对象,username和nickname都为NULL,看下序列化时输出什么:
User user = new User();
ObjectMapper objectMapper = new ObjectMapper();
String str = objectMapper.writeValueAsString(user);
System.out.println(str);
输出如下:可以看到,nickname没有输出,同时username虽然是null值,但是也输出了,因为我们没有对username进行隐藏;
2. 类加注解
注解:@JsonInclude
这个很好理解,就是类的所有字段,如果有NULL值就对其隐藏;
类加注解的方式跟字段加注解的方式是一致的,加注解的实体类如下所示:
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(value = JsonInclude.Include.NON_NULL)
public class User {
private String username;
public String nickname;
}
此时序列化时,username和nickname值如果为NULL,则会被隐藏;
还是创建一个空的User对象,如下所示:
User user = new User();
ObjectMapper objectMapper = new ObjectMapper();
String str = objectMapper.writeValueAsString(user);
System.out.println(str);
打印如下:可以看到,username和nickname都被隐藏了
3. 全局配置
这种方式就是直接操作ObjectMapper对象,然后所有序列化的对象如果有属性为NULL,那么对应的属性就会被隐藏;
实体类就不列出了,跟上面的一样,只是没有了注解@JsonInclude;
全局配置的代码如下所示:
User user = new User();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String str = objectMapper.writeValueAsString(user);
System.out.println(str);
控制台输出如下:所有NULL的属性都被隐藏
4. 相关配置
上面主要介绍了NULL值的隐藏配置,其实Jackson还提供了其他的相关配置,如下所示:
默认配置是ALWAYS,即所有字段默认都会被序列化,不管字段值的内容是什么;
再比如NON_EMPTY,就是排除字符串为空、列表等为空的属性;
总结
序列化时,隐藏NULL属性值,是为了输出的JSON字符串更加简洁;
这里核心的知识点就是Include枚举类,通过不同的枚举值,实现不同的隐藏效果;
我们可以通过字段、类、全局这三个层面进行配置;
当然如果有特殊的需求(比如我想要知道输出对象拥有的所有字段),那么就不能隐藏NULL属性值;
评论区