前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >jackson学习之六:常用类注解

jackson学习之六:常用类注解

作者头像
程序员欣宸
发布2022-04-13 13:09:39
2900
发布2022-04-13 13:09:39
举报
文章被收录于专栏:实战docker实战docker

欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

本篇概览

  • 本文是《jackson学习》系列的第六篇,继续学习jackson强大的注解能力,本篇学习的是常用的类注解,并通过实例来加深印象,下图是常用类注解的简介:
  • 接下来逐个学习;

源码下载

  1. 如果您不想编码,可以在GitHub下载所有源码,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):

名称

链接

备注

项目主页

该项目在GitHub上的主页

git仓库地址(https)

该项目源码的仓库地址,https协议

git仓库地址(ssh)

git@github.com:zq2599/blog_demos.git

该项目源码的仓库地址,ssh协议

  1. 这个git项目中有多个文件夹,本章的应用在jacksondemo文件夹下,如下图红框所示:
  1. jacksondemo是父子结构的工程,本篇的代码在annotation子工程中,里面的classannonation这个package下,如下图:

JsonRootName

  1. JsonRootName的设置如下:
代码语言:javascript
复制
@JsonRootName(value = "aaabbbccc")
static class Test {
	private String field0;

	public String getField0() { return field0; }
    public void setField0(String field0) { this.field0 = field0; }
    }
  1. 开启root对象特性方法,以及序列化结果如下图,可见JsonRootName注解的value值aaabbbccc成了root对象的key:
  1. 开启root对象的反序列化特性后,用上述红框3中的json字符串可反序列化成Test类的实例;
  2. 关于root对象的序列化和反序列化特性,可以参考《jackson学习之四:WRAP_ROOT_VALUE(root对象)》

JsonIgnoreProperties

  1. 该注解用于指定序列化和反序列化时要忽略的字段,如下所示,Test类的field1和field2被设置为不参与序列化和反序列化操作:
代码语言:javascript
复制
    @JsonIgnoreProperties({"field1", "field2"})
    static class Test {
        private String field0;
        private String field1;
        private String field2;
        // 省去get、set、toString方法
  1. 演示代码是JsonIgnorePropertiesSeriallization.java,执行结果如下图:
  1. 保持Test.java的JsonIgnoreProperties注解不变,再试试反序列化,对应的代码在JsonIgnorePropertiesDeserializer.java,如下图,反序列化后field1和field2依然是null,也就是说反序列化操作中,field1和field2都被忽略了:

JsonIgnoreType

  1. 被该注解修饰的类,作为其他类的成员变量时,不论是序列化还是反序列化都被忽略了;
  2. 来验证一下,如下所示,TestChild类被JsonIgnoreType注解修饰:
代码语言:javascript
复制
    @JsonIgnoreType
    static class TestChild {
        private int value;
        // 省去get、set、toString方法
  1. 如下所示,再把TestChild作为Test类的成员变量:
代码语言:javascript
复制
    static class Test {
        private String field0;
        private TestChild field1;
        // 省去get、set、toString方法
  1. 序列化操作的代码是JsonIgnoreTypeSerialization.java,执行结果如下图,可见类型为TestChild的field1字段,在序列化的时候被忽略了:
  1. 再来试试反序列化,代码在JsonIgnoreTypeDeserializer.java,如下图,可见带有注解JsonIgnoreType的类作为成员变量,在反序列化时会被忽略:

JsonAutoDetect

  1. 序列化和反序列化时自动识别的范围,如下:
代码语言:javascript
复制
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY)
public class College {
    private String name;
    private String city;
    protected int age = 100;
  1. fieldVisibility属性有以下值可选:
代码语言:javascript
复制
ANY // 所有
NON_PRIVATE // private之外的
PROTECTED_AND_PUBLIC // protected和public的(此时privte和默认的package access时不能被自动识别的)
PUBLIC_ONLY // public的
NONE // 禁止自动识别
DEFAULT // 默认的,用于继承父类的自动识别的范围
  1. 验证,如下图,College类设置了注解,fieldVisibility是PUBLIC_ONLY,红框中显示age字段是protected类型的:
  1. 序列化结果如下图红框,age字段没有输出:
  1. fieldVisibility改成NON_PRIVATE再试试:
  1. 如下图红框,age可以成功序列化了:

JsonPropertyOrder

  1. 这个注解好理解,就是指定序列化的顺序,注意该注解仅在序列化场景有效;
  2. 先看看没有JsonPropertyOrder注解时的序列化顺序,Test.java如下所示,是和代码的顺序一致的:
代码语言:javascript
复制
    static class Test {
        private String field0;
        private String field1;
        private String field2;
        // 省去get、set、toString方法
  1. 此时对Test的实例做序列化操作,结果如下图,顺序和代码顺序一致:
  1. 现在给Test类加上JsonPropertyOrder注解,顺序是field2、field0、field1:
代码语言:javascript
复制
    @JsonPropertyOrder({"field2", "field0", "field1"})
    static class Test {
        private String field0;
        private String field1;
        private String field2;
        // 省去get、set、toString方法
  1. 执行结果如下图所示,也是field2、field0、field1:

JsonInclude

  1. 注解JsonInclude仅在序列化场景有效;
  2. 通过该注解控制某些字段不被序列化(例如空字符串不被序列化);
  3. 可以设置以下几种限制:
代码语言:javascript
复制
ALWAYS // 默认策略,任何情况都执行序列化
NON_NULL // 非空
NON_ABSENT // null的不会序列化,但如果类型是AtomicReference,依然会被序列化
NON_EMPTY // null、集合数组等没有内容、空字符串等,都不会被序列化
NON_DEFAULT // 如果字段是默认值,就不会被序列化
CUSTOM // 此时要指定valueFilter属性,该属性对应一个类,用来自定义判断被JsonInclude修饰的字段是否序列化
USE_DEFAULTS // 当JsonInclude在类和属性上都有时,优先使用属性上的注解,此时如果在序列化的get方法上使用了JsonInclude,并设置为USE_DEFAULTS,就会使用类注解的设置  
  1. JsonInclude涉及的知识点较多,已在一篇单独文章中详细说明,请参考《jackson学习之五:JsonInclude注解》

至此,Jackson的常用类注解的学习和实战就完成了,接下来的文章,我们会学习常用的属性注解;

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-04-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 欢迎访问我的GitHub
  • 本篇概览
  • 源码下载
  • JsonRootName
  • JsonIgnoreProperties
  • JsonIgnoreType
  • JsonAutoDetect
  • JsonPropertyOrder
  • JsonInclude
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档