
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
ALWAYS // 默认策略,任何情况都执行序列化
NON_NULL // 非空
NON_ABSENT // null的不会序列化,但如果类型是AtomicReference,依然会被序列化
NON_EMPTY // null、集合数组等没有内容、空字符串等,都不会被序列化
NON_DEFAULT // 如果字段是默认值,就不会被序列化
CUSTOM // 此时要指定valueFilter属性,该属性对应一个类,用来自定义判断被JsonInclude修饰的字段是否序列化
USE_DEFAULTS // 当JsonInclude在类和属性上都有时,优先使用属性上的注解,此时如果在序列化的get方法上使用了JsonInclude,并设置为USE_DEFAULTS,就会使用类注解的设置 名称 | 链接 | 备注 |
|---|---|---|
项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |


ALWAYS表示全部序列化,如下图,null和空字符串都会序列化:

NON_NULL好理解,就是值为null就不序列化:

<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.11.0</version>
</dependency>mapper.registerModule(new Jdk8Module());

小结NON_ABSENT的效果: a. 自身为null的字段不会被序列化; b. Optional类型的字段,如果引用值为null,该字段不会被序列化; c. AtomicReference类型的字段,如果引用值为null,该字段不会被序列化;
NON_EMPTY好理解,以下情况都不会被序列化:


@JsonInclude(value = JsonInclude.Include.CUSTOM,
valueFilter = CustomFilter.class)
private String field0;static class CustomFilter {
@Override
public boolean equals(Object obj) {
// null,或者不是字符串就返回true,意味着不被序列化
if(null==obj || !(obj instanceof String)) {
return true;
}
// 长度大于2就返回true,意味着不被序列化
return ((String) obj).length() > 2;
}
}
USE_DEFAULTS的用法也有点绕,咱们通过对比的方法来学习;
@JsonInclude(JsonInclude.Include.NON_EMPTY)
static class Test {
@JsonInclude(JsonInclude.Include.NON_NULL)
private List<String> field0;
public List<String> getField0() { return field0; }
public void setField0(List<String> field0) { this.field0 = field0; }
}
@JsonInclude(JsonInclude.Include.USE_DEFAULTS)
public List<String> getField0() {
return field0;
}
小结USE_DEFAULTS的作用如下: a. 类注解和成员变量注解同时存在时,以成员变量注解为准; b. 如果对应的get方法也使用了JsonInclude注解,并且值是USE_DEFAULTS,此时以类注解为准;
至此,JsonInclude注解的学习和实战就完成了,希望本文能给您提供参考,助您熟练使用注解来指定更精确的序列化过滤策略;