写点什么

jackson 学习之六:常用类注解,java 编程思想第五版电子书

用户头像
极客good
关注
发布于: 刚刚
  1. 开启 root 对象特性的代码以及序列化结果如下图,可见 JsonRootName 注解的 value 值 aaabbbccc 成了 root 对象的 key:



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

  2. 关于 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,执行结果如下图:



  1. 保持 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 字段,在序列化的时候被忽略了:



  1. 再来试试反序列化,代码在 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 类型的:



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



  1. fieldVisibility 改成 NON_PRIVATE 再试试:



  1. 如下图红框,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 的实例做序列化操作,结果如下图,顺序和代码顺序一致:


![在这里插入图片描述](https://img-blog.csdnimg.cn/20200914220500312.png?x-oss-process=image/watermark,type_ZmFuZ3po


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


ZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JvbGluZ19jYXZhbHJ5,size_16,color_FFFFFF,t_70#pic_center)


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


@JsonPropertyOrder({"field2", "field0", "field1"})


static class Test {

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
jackson学习之六:常用类注解,java编程思想第五版电子书