#yyds干货盘点#jackson学习之六:常用类注解

Posted 程序员欣宸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点#jackson学习之六:常用类注解相关的知识,希望对你有一定的参考价值。

欢迎访问我的GitHub

本篇概览

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

    源码下载

  3. 如果您不想编码,可以在GitHub下载所有源码,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):
名称 链接 备注
项目主页 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协议
  1. 这个git项目中有多个文件夹,本章的应用在==jacksondemo==文件夹下,如下图红框所示:
  2. jacksondemo是父子结构的工程,本篇的代码在==annotation==子工程中,里面的==classannonation==这个package下,如下图:

    JsonRootName

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

    JsonIgnoreProperties

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

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

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

    JsonIgnoreType

  10. 被该注解修饰的类,作为其他类的成员变量时,不论是序列化还是反序列化都被忽略了;
  11. 来验证一下,如下所示,==TestChild==类被==JsonIgnoreType==注解修饰:

    @JsonIgnoreType
    static class TestChild 
        private int value;
        // 省去get、set、toString方法
  12. 如下所示,再把TestChild作为Test类的成员变量:

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

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

    JsonAutoDetect

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

    @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY)
    public class College 
    private String name;
    private String city;
    protected int age = 100;
  16. ==fieldVisibility==属性有以下值可选:

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

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

  19. ==fieldVisibility==改成==NON_PRIVATE==再试试:

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

JsonPropertyOrder

  1. 这个注解好理解,就是指定序列化的顺序,注意该注解==仅在序列化场景有效==;
  2. 先看看没有JsonPropertyOrder注解时的序列化顺序,Test.java如下所示,是和代码的顺序一致的:

    static class Test 
        private String field0;
        private String field1;
        private String field2;
        // 省去get、set、toString方法
  3. 此时对Test的实例做序列化操作,结果如下图,顺序和代码顺序一致:

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

    @JsonPropertyOrder("field2", "field0", "field1")
    static class Test 
        private String field0;
        private String field1;
        private String field2;
        // 省去get、set、toString方法
  5. 执行结果如下图所示,也是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,就会使用类注解的设置  
  6. JsonInclude涉及的知识点较多,已在一篇单独文章中详细说明,请参考《jackson学习之五:JsonInclude注解》
  • 至此,Jackson的常用类注解的学习和实战就完成了,接下来的文章我们学习常用的属性注解;

欢迎关注51CTO博客:程序员欣宸

以上是关于#yyds干货盘点#jackson学习之六:常用类注解的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#jackson学习之五:JsonInclude注解

#yyds干货盘点#jackson学习之九:springboot整合(配置文件)

#yyds干货盘点#JUnit5学习之六:参数化测试(Parameterized Tests)基础

#yyds干货盘点#JUnit5学习之二:Assumptions类

#yyds干货盘点#JUnit5学习之八:综合进阶(终篇)

jackson学习之六:常用类注解