jackson 学习之八:常用方法注解
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
本文是《jackson 学习》系列的第八篇,继续学习 jackson 强大的注解能力,本篇学习常用的方法注解,并通过实例来加深印象,下图是常用方法注解的简介:
源码下载
如果您不想编码,可以在 GitHub 下载所有源码,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):
这个 git 项目中有多个文件夹,本章的应用在 jacksondemo 文件夹下,如下图红框所示:
jacksondemo 是父子结构的工程,本篇的代码在 annotation 子工程中,里面的 methodannotation 这个 package 下,如下图:
JsonValue
在序列化时起作用,可以用来注解 get 方法或者成员变量;
一个类中,JsonValue 只允许出现一次;
如果注解的是 get 方法,那么该方法的返回值就是整个实例的序列化结果;
如果注解的是成员变量,那么该成员变量的值就是整个实例的序列化结果;
下面是用来测试的 Pojo 类,JsonValue 注解放在 getField0 方法上,此方法的返回值已经写死了"abc":
Test 类的序列化结果如下,即 getField0 方法的返回值:
JsonCreator
在反序列化时,当出现有参构造方法时(可能是多个有参构造方法),需要通过 JsonCreator 注解指定反序列化时用哪个构造方法,并且在入参处还要通过 JsonProperty 指定字段关系:
反序列化结果如下:
JsonSetter
JsonSetter 注解在 set 方法上,被用来在反序列化时指定 set 方法对应 json 的哪个属性;
JsonSetter 源码中,推荐使用 JsonProperty 来取代 JsonSetter:
测试代码和结果如下,可见反序列化时,是按照 JsonSetter 的 value 去 json 中查找属性的:
JsonGetter
JsonGetter 只能作为方法注解;
在序列化时,被 JsonGetter 注解的 get 方法,对应的 json 字段名是 JsonGetter 的 value;
JsonGetter 源码中,推荐使用 JsonProperty 来取代 JsonGetter:
测试代码和结果如下,可见序列化时 JsonGetter 的 value 会被作为 json 字段名:
JsonAnyGetter
JsonAnyGetter 的作用有些特别:在序列化时,用 Map 对象的键值对转成 json 的字段和值;
理解 JsonAnyGetter 最好的办法,是对比使用前后序列化结果的变化,先来看以下这段代码,是没有 JsonAnyGetter 注解的,Test 有两个成员变量,其中 map 字段是 HashMap 类型的:
上述代码的执行结果如下,其实很好理解,就是 field0 和 map 两个字段而已:
接下来,对上述代码做一处改动,如下图红框所示,给 getMap 方法增加 JsonAnyGetter 注解:
修改后的执行结果如下,原来的 map 字段没有了,map 内部的所有键值对都成了 json 的字段:
至此,可以品味出 JsonAnyGetter 的作用了:序列化时,将 Map 中的键值对全部作为 JSON 的字段输出;
JsonAnySetter
弄懂了前面的 JsonAnyGetter,对于 JsonAnySetter 的作用想必您也能大致猜到:反序列化时,对 json 中不认识的字段,统统调用 JsonAnySetter 注解修饰的方法去处理;
测试的代码如下,Test 类的 setValue 方法被 JsonAnySetter 注解,在反序列化时,json 中的 aaa 和 bbb 字段,都会交给 setValue 方法处理,也就是放入 map 中:
执行结果如下,可见 aaa、bbb 都被放入了 map 中:
另外 JsonAnySetter 还可以作用在成员变量上,上面的代码中,去掉 setValue 方法,在成员变量 map 上增加 JsonAnySetter 注解,修改后如下,执行结果也是一模一样的:
注意,JsonAnySetter 作用在成员变量上时,该成员变量必须是 java.util.Map 的实现类;
至此,Jackson 常用注解已全部实战完毕,希望这些丰富的注解能助您制定出各种灵活的序列化和反序列化策略;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/b9abc43d9c992862b850c9938】。文章转载请联系作者。
评论