侧边栏壁纸
  • 累计撰写 94 篇文章
  • 累计创建 100 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

Jackson如何隐藏值为空的属性

汤圆学Java
2022-02-14 / 0 评论 / 0 点赞 / 241 阅读 / 2,514 字
温馨提示:
本文最后更新于 2022-02-14,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

前面介绍了Jackson可以隐藏指定的字段,不管那个字段有没有值;

实际场景中,我们还会用到的就是隐藏值为NULL的字段;

本篇就来介绍下隐藏NULL属性值的多种方法;

下面这三种方法由上到下,覆盖范围逐渐扩大;

目录

  1. 字段加注解
  2. 类加注解
  3. 全局隐藏
  4. 相关配置

正文

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进行隐藏;

image-20220214115610065

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都被隐藏了

image-20220214120658781

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的属性都被隐藏

image-20220214121054690

4. 相关配置

上面主要介绍了NULL值的隐藏配置,其实Jackson还提供了其他的相关配置,如下所示:

image-20220214121523012

默认配置是ALWAYS,即所有字段默认都会被序列化,不管字段值的内容是什么;

再比如NON_EMPTY,就是排除字符串为空、列表等为空的属性;

总结

序列化时,隐藏NULL属性值,是为了输出的JSON字符串更加简洁;

这里核心的知识点就是Include枚举类,通过不同的枚举值,实现不同的隐藏效果;

我们可以通过字段、类、全局这三个层面进行配置;

当然如果有特殊的需求(比如我想要知道输出对象拥有的所有字段),那么就不能隐藏NULL属性值;

0

评论区