jackson学习之五:JsonInclude注解,颠覆认知
ALWAYS
ALWAYS表示全部序列化,如下图,null和空字符串都会序列化:
NON_NULL
NON_NULL好理解,就是值为null就不序列化:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020090511122310.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JvbGluZ19jYXZhbHJ5,size_1
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
6,color_FFFFFF,t_70#pic_center)
NON_ABSENT
NON_ABSENT略为复杂,当实例化的对象有Optional或AtomicReference类型的成员变量时,如果Optional引用的实例为空,用NON_ABSENT能使该字段不做序列化;
Optional是java用来优雅处理空指针的一个特性,本文中不做过多说明,请您自行查阅相关文档;
要让Jackson支持Optional特性,必须做两件事,首先是在pom.xml中添加以下依赖:
com.fasterxml.jackson.datatype
jackson-datatype-jdk8
2.11.0
- 其次是代码中执行以下设置:
mapper.registerModule(new Jdk8Module());
- 咱们先看看设置成NON_NULL时jackson对Optional和AtomicReference的处理,下面的代码中,Optional和AtomicReference的引用都是空,但还是被序列化出来了:
- 代码不变,将NON_NULL改为NON_ABSENT试试,如下图,可见field2和field3都没有序列化了:
小结NON_ABSENT的效果:
a. 自身为null的字段不会被序列化;
b. Optional类型的字段,如果引用值为null,该字段不会被序列化;
c. AtomicReference类型的字段,如果引用值为null,该字段不会被序列化;
NON_EMPTY
NON_EMPTY好理解,以下情况都不会被序列化:
null
空字符串
空集合
空数组
Optional类型的,其引用为空
AtomicReference类型的,其引用为空
演示代码和结果如下图,可见上述场景全部没有被序列化:
NON_DEFAULT
- 设置为NON_DEFAULT后,对保持默认值的字段不做序列化,如下图:
CUSTOM
相对其他类型,CUSTOM略为复杂,这个值要配合valueFilter属性一起使用;
如下所示,JsonInclude的value等于CUSTOM时,在序列化的时候会执行CustomFilter的equals方法,该方法的入参就是field0的值,如果equals方法返回true,field0就不会被序列化,如果equals方法返回false时field0才会被序列化
@JsonInclude(value = JsonInclude.Include.CUSTOM,
valueFilter = CustomFilter.class)
private String field0;
- 来看看CustomFilter类的代码,如下所示,只有equals方法,可见:null、非字符串、长度大于2这三种情况都返回true,也就是说这三种情况下都不会被序列化:
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;
}
}
- 下面贴出完整代码和结果,您就一目了然了:
- 再次强调:valueFilter的equals方法返回true,意味着该字段不会被序列化!!!
USE_DEFAULTS
USE_DEFAULTS的用法也有点绕,咱们通过对比的方法来学习;
- 代码如下所示,在类和成员变量上都有JsonInclude注解,序列化field0的时候,是哪个注解生效呢?:
@JsonInclude(JsonInclude.Include.NON_EMPTY)
static class Test {
@JsonInclude(JsonInclude.Include.NON_NULL)
private List field0;
public List getField0() { return field0; }
public void setField0(List field0) { this.field0 = field0; }
}
- 把field0设置为空集合,运行代码试试,如果类上的注解生效,那么field0就不会被序列化(NON_EMPTY会过滤掉空集合),如果成员变量上的注解生效,field0就会被序列化(NON_NULL只过滤null,空集合不是null),执行结果如下图,可见是成员变量上的注解生效了:
- 接下来保持上述代码不变,仅在getField0方法上添加JsonInclude注释,值是USE_DEFAULTS,这样在序列化过程中,调用getField0方法时,就用类注解JsonInclude的值了,即NON_EMPTY:
@JsonInclude(JsonInclude.Include.USE_DEFAULTS)
public List getField0() {
return field0;
}
- 执行修改后的代码,如下图所示,此时用的成员变量field0上的注解就不生效了,而是类注解生效,导致空集合不被序列化:
小结USE_DEFAULTS的作用如下:
jackson学习之五:JsonInclude注解,颠覆认知相关推荐
- jackson学习之五:JsonInclude注解
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章汇总 jackson学习之一:基本信息 jac ...
- jackson学习之一:基本信息
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章汇总 jackson学习之一:基本信息 jac ...
- # Jackson 学习使用
Jackson 学习使用 文章目录 Jackson 学习使用 Jackson 优点 Jackson 的核心模块 引入 Jackson 依赖 多态类型的序列化及反序列化 @JsonTypeInfo Ob ...
- Jackson学习笔记
Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的J ...
- eclipsevue代码怎么运行_打了多年的单片机调试断点到底应该怎么设置? | 颠覆认知...
导读:程序运行过程中,有些数据被莫名修改了,在哪里修改的?又是怎么修改的?这个代码我只想知道是否运行过,或者运行了多少次,但是不想让程序停下来,或者仅打印调试信息,怎么办?当这个变量设置成某个数据后, ...
- day 83 Vue学习之五DIY脚手架、webpack使用、vue-cli的使用、element-ui
Vue学习之五DIY脚手架.webpack使用.vue-cli的使用.element-ui 本节目录 一 vue获取原生DOM的方式 二 DIY脚手架 三 vue-cli脚手架的使用 四 webpac ...
- 向顶尖高手学习技巧,方法,认知,成长路径
向顶尖高手学习技巧,方法,认知,成长路径 顶尖高手的成功不可复制只能学习,每天都比前一天进步,每日精进 越难的事情越要早做.久做.不停的做 从提高自己的不可替代性开始,专注做到极致才具有不可替代性 只 ...
- Science新研究颠覆认知,有望一举解决困扰器官移植60余年问题,网友:生物课本得改了...
鱼羊 金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 看来这一次,免疫学教科书得改版了. 事情是这样的. 顶级期刊 Science 发表了一篇关于免疫学方面的重磅文章(共同一作还是一位华人 ...
- Hibernate学习之Hibernate注解总结
Hibernate学习之Hibernate注解总结http://www.bieryun.com/3269.html 一.类级别的注解 @Entity name:表的名字(可选)一般表名和类名相同 必须 ...
最新文章
- JS实现录音,播放完整代码带示例图
- “这块布的艺术成分都几高唧!”“有几高啊?”“三、四层楼那么高啦。”...
- android 请求参数打印,android retrofit 请求参数格式RequestBody的方法
- python基础教程:可变,不可变数据类型
- QT的QSemaphoreReleaser类的使用
- 这些Python好书,助你开发一臂之力
- XCTF-高手进阶区:i-got-id-200
- Django操作与内容
- 《从零开始学Swift》学习笔记(Day 39)——构造函数重载
- apl脚本入门-控制语句
- 学51单片机需要专门把C语言学透吗
- 超详细MySQL安装及基本使用教程
- js原生简单生成卡密例子
- 三星Note3 SM-N9009 国内天翼版本安装谷歌框架
- 常用的锂电池充电IC芯片
- 字符串与整型的相互转换
- Deep Crossing: Web-Scale Modeling without Manually Crafted Combinatorial Features(2016)
- 马蜂窝 iOS App 启动治理:回归用户体验
- 如何组织一场安全、可靠、高效的网络实战攻防演习?
- 实验四 VLAN 实验——实现同一个vlan组下PC互通,不同vlan组下的不能互通