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

  1. NON_ABSENT略为复杂,当实例化的对象有Optional或AtomicReference类型的成员变量时,如果Optional引用的实例为空,用NON_ABSENT能使该字段不做序列化;

  2. Optional是java用来优雅处理空指针的一个特性,本文中不做过多说明,请您自行查阅相关文档;

  3. 要让Jackson支持Optional特性,必须做两件事,首先是在pom.xml中添加以下依赖:

com.fasterxml.jackson.datatype

jackson-datatype-jdk8

2.11.0

  1. 其次是代码中执行以下设置:

mapper.registerModule(new Jdk8Module());

  1. 咱们先看看设置成NON_NULL时jackson对Optional和AtomicReference的处理,下面的代码中,Optional和AtomicReference的引用都是空,但还是被序列化出来了:

  1. 代码不变,将NON_NULL改为NON_ABSENT试试,如下图,可见field2和field3都没有序列化了:

小结NON_ABSENT的效果:

a. 自身为null的字段不会被序列化;

b. Optional类型的字段,如果引用值为null,该字段不会被序列化;

c. AtomicReference类型的字段,如果引用值为null,该字段不会被序列化;

NON_EMPTY

NON_EMPTY好理解,以下情况都不会被序列化:

  1. null

  2. 空字符串

  3. 空集合

  4. 空数组

  5. Optional类型的,其引用为空

  6. AtomicReference类型的,其引用为空

  7. 演示代码和结果如下图,可见上述场景全部没有被序列化:

NON_DEFAULT

  1. 设置为NON_DEFAULT后,对保持默认值的字段不做序列化,如下图:

CUSTOM

  1. 相对其他类型,CUSTOM略为复杂,这个值要配合valueFilter属性一起使用;

  2. 如下所示,JsonInclude的value等于CUSTOM时,在序列化的时候会执行CustomFilter的equals方法,该方法的入参就是field0的值,如果equals方法返回true,field0就不会被序列化,如果equals方法返回false时field0才会被序列化

@JsonInclude(value = JsonInclude.Include.CUSTOM,

valueFilter = CustomFilter.class)

private String field0;

  1. 来看看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;

}

}

  1. 下面贴出完整代码和结果,您就一目了然了:

  • 再次强调:valueFilter的equals方法返回true,意味着该字段不会被序列化!!!

USE_DEFAULTS

USE_DEFAULTS的用法也有点绕,咱们通过对比的方法来学习;

  1. 代码如下所示,在类和成员变量上都有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; }

}

  1. 把field0设置为空集合,运行代码试试,如果类上的注解生效,那么field0就不会被序列化(NON_EMPTY会过滤掉空集合),如果成员变量上的注解生效,field0就会被序列化(NON_NULL只过滤null,空集合不是null),执行结果如下图,可见是成员变量上的注解生效了:

  1. 接下来保持上述代码不变,仅在getField0方法上添加JsonInclude注释,值是USE_DEFAULTS,这样在序列化过程中,调用getField0方法时,就用类注解JsonInclude的值了,即NON_EMPTY:

@JsonInclude(JsonInclude.Include.USE_DEFAULTS)

public List getField0() {

return field0;

}

  1. 执行修改后的代码,如下图所示,此时用的成员变量field0上的注解就不生效了,而是类注解生效,导致空集合不被序列化:

小结USE_DEFAULTS的作用如下:

jackson学习之五:JsonInclude注解,颠覆认知相关推荐

  1. jackson学习之五:JsonInclude注解

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章汇总 jackson学习之一:基本信息 jac ...

  2. jackson学习之一:基本信息

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章汇总 jackson学习之一:基本信息 jac ...

  3. # Jackson 学习使用

    Jackson 学习使用 文章目录 Jackson 学习使用 Jackson 优点 Jackson 的核心模块 引入 Jackson 依赖 多态类型的序列化及反序列化 @JsonTypeInfo Ob ...

  4. Jackson学习笔记

    Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的J ...

  5. eclipsevue代码怎么运行_打了多年的单片机调试断点到底应该怎么设置? | 颠覆认知...

    导读:程序运行过程中,有些数据被莫名修改了,在哪里修改的?又是怎么修改的?这个代码我只想知道是否运行过,或者运行了多少次,但是不想让程序停下来,或者仅打印调试信息,怎么办?当这个变量设置成某个数据后, ...

  6. day 83 Vue学习之五DIY脚手架、webpack使用、vue-cli的使用、element-ui

    Vue学习之五DIY脚手架.webpack使用.vue-cli的使用.element-ui 本节目录 一 vue获取原生DOM的方式 二 DIY脚手架 三 vue-cli脚手架的使用 四 webpac ...

  7. 向顶尖高手学习技巧,方法,认知,成长路径

    向顶尖高手学习技巧,方法,认知,成长路径 顶尖高手的成功不可复制只能学习,每天都比前一天进步,每日精进 越难的事情越要早做.久做.不停的做 从提高自己的不可替代性开始,专注做到极致才具有不可替代性 只 ...

  8. Science新研究颠覆认知,有望一举解决困扰器官移植60余年问题,网友:生物课本得改了...

    鱼羊 金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 看来这一次,免疫学教科书得改版了. 事情是这样的. 顶级期刊 Science 发表了一篇关于免疫学方面的重磅文章(共同一作还是一位华人 ...

  9. Hibernate学习之Hibernate注解总结

    Hibernate学习之Hibernate注解总结http://www.bieryun.com/3269.html 一.类级别的注解 @Entity name:表的名字(可选)一般表名和类名相同 必须 ...

最新文章

  1. JS实现录音,播放完整代码带示例图
  2. “这块布的艺术成分都几高唧!”“有几高啊?”“三、四层楼那么高啦。”...
  3. android 请求参数打印,android retrofit 请求参数格式RequestBody的方法
  4. python基础教程:可变,不可变数据类型
  5. QT的QSemaphoreReleaser类的使用
  6. 这些Python好书,助你开发一臂之力
  7. XCTF-高手进阶区:i-got-id-200
  8. Django操作与内容
  9. 《从零开始学Swift》学习笔记(Day 39)——构造函数重载
  10. apl脚本入门-控制语句
  11. 学51单片机需要专门把C语言学透吗
  12. 超详细MySQL安装及基本使用教程
  13. js原生简单生成卡密例子
  14. 三星Note3 SM-N9009 国内天翼版本安装谷歌框架
  15. 常用的锂电池充电IC芯片
  16. 字符串与整型的相互转换
  17. Deep Crossing: Web-Scale Modeling without Manually Crafted Combinatorial Features(2016)
  18. 马蜂窝 iOS App 启动治理:回归用户体验
  19. 如何组织一场安全、可靠、高效的网络实战攻防演习?
  20. 实验四 VLAN 实验——实现同一个vlan组下PC互通,不同vlan组下的不能互通

热门文章

  1. 2022年计算机软件水平考试信息系统项目管理(高级)练习题及答案
  2. python+opencv-12 黑帽和礼帽运算
  3. 科大讯飞离线命令词识别
  4. Python核心编程(第3版)第2章网络编程中关于tcp/udp服务器和客户端实现代码的运行出错的修正
  5. 7. Applepay 解码实操-golang
  6. 恒生电子实习记录-2
  7. 计蒜课中沙子的质量(动态规划)感想
  8. 福禄克9100校准仪维修案例
  9. 函数模板和普通函数区别
  10. 新人!发个 电力信息化可研模板*