引言
导入指引:import com.fasterxml.jackson.annotation.JsonProperty;
maven指引:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.12.4</version>
</dependency>
这是一个开源的对JSON数据进行操作的库(Jackson库)
是一家专于java的公司FasterXML的产品
简易版
我们设置成这样
就会这样
正文
-
我们都知道,在字段上加上注解@JsonProperty(“name”),再指定它的name,就可以在序列化和反序列化时采用我们使用的别名,那么它的源码是怎样的呢?
-
那我们直接进入它的json构造过程吧
-
首先先是使用了一个sw(不重要,估计是构造的方式,和选的方法有关,是生成String),生成了一个json的构造器
-
进来后呢,它对构造器进行了正确性判断和初始化,然后对比我序列化的类是否为需要关闭的类(我用的是Student,显然不需要关闭)
-
这边常规检查,确定我们序列化有没有差错和例外(这就是考虑所有情况的困难之处)
-
确保没有问题开始序列化
-
这是个抽象方法,代表每个类型的JsonSerializer都有不同的实现方法
-
所以我们得回去找是匹配了哪个构造器
-
这边看到它还进行了一系列hash计算,甚至还专门配了个桶来给你定位(那我们不好算了,得用点手段)
-
好好好,算了半天我的Student它没有给分类,被定义为Bucket{null}
-
我们继续为null,往下走
-
这边给上了一个BeanSerializer for Student,这个是生成的自定义构造器
-
我们通过给的构造器分类进入了最终的加工工程,根据是否有处理过类分为_props和_filteredProps。我们的字段name就被处理过,改成了("name_in_chinese"),所以我们就是_filteredProps
-
在这里识别出来了,我加了name_in_chinese处理
-
我们在DeBug也能看到,它调用了getName()方法
-
也对方法进行了反射处理,将方法的名字保存下来了。
-
我们的注解此时也被读下来了,有别名,序号等
-
相信大家也可以看出,最后是怎样进行json的拼接了
-
我们有看到,该注解支持方法,那我们试试将注解注到方法上会有什么不一样?
-
从字段上的反射组到了方法的反射组,那说明基本是没有什么影响的。
-
我们这样设置
-
将这个json转换回去
-
获取不到,这说明反序列化时name_in_chinese字段并没有被读到name
-
设置成一样的呢?
总结
在序列化和反序列化的场景下,我们时常需要灵活处理,所以可以对其get,set方法定义不同的注解,以应对我们的需求。