jackson 学习之四:WRAP_ROOT_VALUE(root 对象)
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
本文是《jackson 学习》系列的第四篇,前面学习了常用 API,可以执行最基本的序列化和反序列化操作,接下来要学习的就是 jackson 强大的注解能力,本篇要学的是 root 对象特性,主要内容如下:
关于 root 对象
测试用的 POJO 类
序列化实战
反序列化实战
关于 root 对象(WRAP_ROOT_VALUE)
对于只有 id 和 name 两个字段的 POJO 实例来说,正常的序列化结果如下:
jackson 在序列化时,可以在上述 json 外面再包裹一层,官方叫做 WRAP_ROOT_VALUE,本文中叫做 root 对象,如下所示,整个 json 的只有一个键值对,key 是 aaabbbccc,value 内部才是 POJO 实例的 id 和 name 字段的值:
提前小结
root 对象特性提前做个小结,这样如果您时间有限,仅看这一节即可:
先看序列化场景:
执行下面代码,jackson 在序列化时会增加 root 对象:
root 对象的 key,默认是实例的类名,如果实例有 JsonRootName 注解,就是该注解的 value 值;
root 对象的 value 如下所示,相当于不支持 root 对象时的序列化结果:
再看反序列化场景:
执行下面代码,jackson 在反序列化时会先解析 root 对象:
root 对象的 key,默认是实例的类名,如果实例有 JsonRootName 注解,就是该注解的 value 值;
root 对象的 value 如下所示,相当于不支持 root 对象时用来反序列化的 json 字符串:
准备两个 POJO 类
用对比的方式可以更清楚了解 JsonRootName 的作用,接下来的学习咱们准备两个 POJO 类,一个没有 JsonRootName 注解,另一个有 JsonRootName 注解:
名为 Order1.java 的,没有 JsonRootName 注解:
名为 Order2.java 的,有 JsonRootName 注解,value 值为 aaabbbccc:
可见 Order1 和 Order2 的代码是一致的,唯一的不同是 Order2 带有注解 JsonRootName;
序列化
需要设置 WRAP_ROOT_VALUE 属性,jackson 才会支持 root 对象,JsonRootName 注解才会发挥作用,设置代码如下:
写一段代码,在不开启 WRAP_ROOT_VALUE 属性的时候执行序列化,再开启 WRAP_ROOT_VALUE 属性执行序列化,对比试试:
执行结果如下,JsonRootName 在序列化时的作用一目了然:指定了 root 对象的 key:
反序列化(默认设置)
在没有做任何设置的时候,下面这个字符串用来反序列化成 Order2 对象,会成功吗?
试了下是可以的:
那下面这个字符串能反序列化成 Order2 对象吗?
代码和结果如下图所示,反序列化时 jackson 并不认识 aaabbbccc 这个 key,因为 jackson 此时并不支持 root 对象:
小结:默认情况下,反序列化时 json 字符串不能有 root 对象;
反序列化(开启 UNWRAP_ROOT_VALUE 属性)
如果开启了 UNWRAP_ROOT_VALUE 属性,用于反序列化的 json 字符串就必须要有 root 对象了,开启 UNWRAP_ROOT_VALUE 属性的代码如下:
代码和结果如下图,可见带有 root 对象的 json 字符串,可以反序列化成功,root 对象的 key 就是 JsonRootName 注解的 value 属性:
值得注意的是,上述 json 字符串中,root 对象的 key 为 aaabbbccc,这和 Order2 的 JsonRootName 注解的 value 值是一致的,如果不一致就会反序列化失败,如下图:
至此,jackson 的 WRAP_ROOT_VALUE 特性就学习完成了,在 web 开发时这是个很常用的功能,用于在最外面包裹一层,以便整体上添加额外的内容,希望能给您带来参考;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/14a2f724c956e1e3edc907102】。文章转载请联系作者。
评论