写点什么

jackson 学习之六:常用类注解

作者:程序员欣宸
  • 2022 年 4 月 11 日
  • 本文字数:2349 字

    阅读完需:约 8 分钟

jackson学习之六:常用类注解

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos


本篇概览

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

  2. 接下来逐个学习;

源码下载

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


  1. 这个 git 项目中有多个文件夹,本章的应用在 jacksondemo 文件夹下,如下图红框所示:

  2. jacksondemo 是父子结构的工程,本篇的代码在 annotation 子工程中,里面的 classannonation 这个 package 下,如下图:

JsonRootName

  1. JsonRootName 的设置如下:

@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

  2. 开启 root 对象的反序列化特性后,用上述红框 3 中的 json 字符串可反序列化成 Test 类的实例;

  3. 关于 root 对象的序列化和反序列化特性,可以参考jackson学习之四:WRAP_ROOT_VALUE(root对象)

JsonIgnoreProperties

  1. 该注解用于指定序列化和反序列化时要忽略的字段,如下所示,Test 类的 field1 field2 被设置为不参与序列化和反序列化操作:


    @JsonIgnoreProperties({"field1", "field2"})    static class Test {        private String field0;        private String field1;        private String field2;        // 省去get、set、toString方法
复制代码
  1. 演示代码是 JsonIgnorePropertiesSeriallization.java,执行结果如下图:

  2. 保持 Test.java JsonIgnoreProperties 注解不变,再试试反序列化,对应的代码在 JsonIgnorePropertiesDeserializer.java,如下图,反序列化后 field1 和 field2 依然是 null,也就是说反序列化操作中,field1 和 field2 都被忽略了


JsonIgnoreType

  1. 被该注解修饰的类,作为其他类的成员变量时,不论是序列化还是反序列化都被忽略了;

  2. 来验证一下,如下所示,TestChild 类被 JsonIgnoreType 注解修饰:

    @JsonIgnoreType    static class TestChild {        private int value;        // 省去get、set、toString方法
复制代码


  1. 如下所示,再把 TestChild 作为 Test 类的成员变量:

    static class Test {        private String field0;        private TestChild field1;        // 省去get、set、toString方法
复制代码
  1. 序列化操作的代码是 JsonIgnoreTypeSerialization.java,执行结果如下图,可见类型为 TestChild 的 field1 字段,在序列化的时候被忽略了

  2. 再来试试反序列化,代码在 JsonIgnoreTypeDeserializer.java,如下图,可见带有注解 JsonIgnoreType 的类作为成员变量,在反序列化时会被忽略:

JsonAutoDetect

  1. 序列化和反序列化时自动识别的范围,如下:


@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY)public class College {    private String name;    private String city;    protected int age = 100;
复制代码


  1. fieldVisibility 属性有以下值可选:


ANY // 所有NON_PRIVATE // private之外的PROTECTED_AND_PUBLIC // protected和public的(此时privte和默认的package access时不能被自动识别的)PUBLIC_ONLY // public的NONE // 禁止自动识别DEFAULT // 默认的,用于继承父类的自动识别的范围
复制代码
  1. 验证,如下图,College 类设置了注解,fieldVisibility 是 PUBLIC_ONLY,红框中显示 age 字段是 protected 类型的:

  2. 序列化结果如下图红框,age 字段不是 public,所以没有输出:

  3. fieldVisibility 改成 NON_PRIVATE 再试试:

  4. 如下图红框,age 不是 private,所以可以被序列化:

JsonPropertyOrder

  1. 这个注解好理解,就是指定序列化的顺序,注意该注解仅在序列化场景有效

  2. 先看看没有 JsonPropertyOrder 注解时的序列化顺序,Test.java 如下所示,是和代码的顺序一致的:

    static class Test {        private String field0;        private String field1;        private String field2;        // 省去get、set、toString方法
复制代码


  1. 此时对 Test 的实例做序列化操作,结果如下图,顺序和代码顺序一致:

  2. 现在给 Test 类加上 JsonPropertyOrder 注解,顺序是 field2、field0、field1:

    @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. 可以设置以下几种限制:

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 的常用类注解的学习和实战就完成了,接下来的文章我们学习常用的属性注解;

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

发布于: 刚刚阅读数: 5
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
jackson学习之六:常用类注解_4月月更_程序员欣宸_InfoQ写作平台