jackson学习之四:WRAP_ROOT_VALUE(root对象)
欢迎访问我的GitHub
https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
系列文章汇总
- jackson学习之一:基本信息
- jackson学习之二:jackson-core
- jackson学习之三:常用API操作
- jackson学习之四:WRAP_ROOT_VALUE(root对象)
- jackson学习之五:JsonInclude注解
- jackson学习之六:常用类注解
- jackson学习之七:常用Field注解
- jackson学习之八:常用方法注解
- jackson学习之九:springboot整合(配置文件)
- jackson学习之十(终篇):springboot整合(配置类)
本篇概览
本文是《jackson学习》系列的第四篇,前面学习了常用API,可以执行最基本的序列化和反序列化操作,接下来要学习的就是jackson强大的注解能力,本篇要学的是root对象特性,主要内容如下:
- 关于root对象
- 测试用的POJO类
- 序列化实战
- 反序列化实战
关于root对象(WRAP_ROOT_VALUE)
- 对于只有id和name两个字段的POJO实例来说,正常的序列化结果如下:
{
"id" : 1,
"name" : "book"
}
- jackson在序列化时,可以在上述json外面再包裹一层,官方叫做WRAP_ROOT_VALUE,本文中叫做root对象,如下所示,整个json的只有一个键值对,key是aaabbbccc,value内部才是POJO实例的id和name字段的值:
{
"aaabbbccc" : {
"id" : 2,
"name" : "food"
}
}
提前小结
root对象特性提前做个小结,这样如果您时间有限,仅看这一节即可:
- 先看序列化场景:
- 执行下面代码,jackson在序列化时会增加root对象:
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
- root对象的key,默认是实例的类名,如果实例有JsonRootName注解,就是该注解的value值;
- root对象的value如下所示,相当于不支持root对象时的序列化结果:
{
"id" : 1,
"name" : "book"
}
- 再看反序列化场景:
- 执行下面代码,jackson在反序列化时会先解析root对象:
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
- root对象的key,默认是实例的类名,如果实例有JsonRootName注解,就是该注解的value值;
- root对象的value如下所示,相当于不支持root对象时用来反序列化的json字符串:
{
"id" : 1,
"name" : "book"
}
准备两个POJO类
用对比的方式可以更清楚了解JsonRootName的作用,接下来的学习咱们准备两个POJO类,一个没有JsonRootName注解,另一个有JsonRootName注解:
- 名为Order1.java的,没有JsonRootName注解:
public class Order1 {
private int id;
private String name;
// 省去get、set、toString方法
...
}
- 名为Order2.java的,有JsonRootName注解,value值为aaabbbccc:
import com.fasterxml.jackson.annotation.JsonRootName;
@JsonRootName(value = "aaabbbccc")
public class Order2 {
private int id;
private String name;
// 省去get、set、toString方法
...
}
- 可见Order1和Order2的代码是一致的,唯一的不同是Order2带有注解JsonRootName;
序列化
- 需要设置WRAP_ROOT_VALUE属性,jackson才会支持root对象,JsonRootName注解才会发挥作用,设置代码如下:
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
- 写一段代码,在不开启WRAP_ROOT_VALUE属性的时候执行序列化,再开启WRAP_ROOT_VALUE属性执行序列化,对比试试:
public static void main(String[] args) throws Exception {
// 实例化Order1和Order2
Order1 order1 = new Order1();
order1. setId(1);
order1.setName("book");
Order2 order2 = new Order2();
order2. setId(2);
order2.setName("food");
// 没有开启WRAP_ROOT_VALUE的时候
logger.info("没有开启WRAP_ROOT_VALUE\n");
ObjectMapper mapper1 = new ObjectMapper();
// 美化输出
mapper1.enable(SerializationFeature.INDENT_OUTPUT);
logger.info("没有JsonRootName注解类,序列化结果:\n\n{}\n\n", mapper1.writeValueAsString(order1));
logger.info("有JsonRootName注解的类,序列化结果:\n\n{}\n\n\n\n", mapper1.writeValueAsString(order2));
// 开启了WRAP_ROOT_VALUE的时候
logger.info("开启了WRAP_ROOT_VALUE\n");
ObjectMapper mapper2 = new ObjectMapper();
// 美化输出
mapper2.enable(SerializationFeature.INDENT_OUTPUT);
// 序列化的时候支持JsonRootName注解
mapper2.enable(SerializationFeature.WRAP_ROOT_VALUE);
logger.info("没有JsonRootName注解类,序列化结果:\n\n{}\n\n", mapper2.writeValueAsString(order1));
logger.info("有JsonRootName注解的类,序列化结果:\n\n{}", mapper2.writeValueAsString(order2));
}
- 执行结果如下,JsonRootName在序列化时的作用一目了然:指定了root对象的key:

反序列化(默认设置)
- 在没有做任何设置的时候,下面这个字符串用来反序列化成Order2对象,会成功吗?
{
"id" : 2,
"name" : "food"
}
- 试了下是可以的:

3. 那下面这个字符串能反序列化成Order2对象吗?
{
"aaabbbccc" : {
"id" : 2,
"name" : "food"
}
}
- 代码和结果如下图所示,反序列化时jackson并不认识aaabbbccc这个key,因为jackson此时并不支持root对象:

- 小结:默认情况下,反序列化时json字符串不能有root对象;
反序列化(开启UNWRAP_ROOT_VALUE属性)
- 如果开启了UNWRAP_ROOT_VALUE属性,用于反序列化的json字符串就必须要有root对象了,开启UNWRAP_ROOT_VALUE属性的代码如下:
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
- 代码和结果如下图,可见带有root对象的json字符串,可以反序列化成功,root对象的key就是JsonRootName注解的value属性:

3. 值得注意的是,上述json字符串中,root对象的key为aaabbbccc,这和Order2的JsonRootName注解的value值是一致的,如果不一致就会反序列化失败,如下图:

- 至此,jackson的WRAP_ROOT_VALUE特性就学习完成了,在web开发时这是个很常用的功能,用于在最外面包裹一层,以便整体上添加额外的内容,希望能给您带来参考;
你不孤单,欣宸原创一路相伴
欢迎关注公众号:程序员欣宸
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos
jackson学习之四:WRAP_ROOT_VALUE(root对象)的更多相关文章
- Jackson学习二之集合类对象与JSON互相转化--转载
原文地址:http://lijingshou.iteye.com/blog/2003059 本篇主要演示如何使用Jackson对List, Map和数组与JSON互相转换. package com.j ...
- jackson学习之一:基本信息
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- jackson学习之二:jackson-core
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- jackson学习之三:常用API操作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- jackson学习之五:JsonInclude注解
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- jackson学习之七:常用Field注解
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- jackson学习之八:常用方法注解
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- jackson学习之九:springboot整合(配置文件)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章汇总 jackson学习之一:基本信息 jac ...
- jackson学习之十(终篇):springboot整合(配置类)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
随机推荐
- NET 5 依赖注入多个服务实现类
依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来. 服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了 ...
- ProGuard使用文档
介绍 是一个对于Java字节码的免费的压缩器,优化器,混淆器和审核器: l 它检测并删除未使用的类,字段,方法和属性. l 它优化字节码并删除未使用的指令. l 它重命名其余类.字段和方法使用短 ...
- Git 是如何存储文件的
01.存储方式 Git 从核心上来看不过是简单地存储键值对(key-value).它允许插入任意类型的内容,并会返回一个键值,通过该键值可以在任何时候再取出该内容. Git 存储数据内容的方式,为每份 ...
- CentOS7离线安装mysql5.6
下载mysql5.6,系统选择redhat,版本选择RHEL7,下载RPM Bundle后得到一个tar文件.这里得到文件MySQL-5.6.44-1.el7.x86_64.rpm-bundle.ta ...
- 感知机:Perceptron Learning Algorithm
感知机是支持向量机SVM和神经网络的基础 f = sign(wx+b) 这样看起来好像是LR是差不多的,LR是用的sigmoid函数,PLA是用的sign符号函数,两者都是线性分类器,主要的差别在于策 ...
- 686. Repeated String Match判断字符串重复几次可以包含另外一个
public static int repeatedStringMatch(String A, String B) { //判断字符串a重复几次可以包含另外一个字符串b,就是不断叠加字符串a直到长度大 ...
- [leetcode]49. Group Anagrams重排列字符串分组
是之前的重排列字符串的延伸,判断是重排列后存到HashMap中进行分组 这种HashMap进行分组的方式很常用 public List<List<String>> groupA ...
- .NET Core学习笔记(8)——Entity Framework Core之Database First
曾经我以为再也不会去弄啥Database First,然鹅我错了.这个世界上就是有啪啪打脸和真香的时候.当小伙伴拿着做好的DB表结构和SQL脚本递过来的时候,我知道我没法拒绝.望着他突起的肱二头肌和充 ...
- 【转载】VUE的背景图引入
我现在的项目要将登录页面的背景引一图片做为背景图片,按原jsp中的写法,发现无法找到背景图片,最后从网上查资料,采用上面的写法,成功显示出背景图片,参考网址 https://blog.csdn.net ...
- 使用mono-repo实现跨项目组件共享
本文会分享一个我在实际工作中遇到的案例,从最开始的需求分析到项目搭建,以及最后落地的架构的整个过程.最终实现的效果是使用mono-repo实现了跨项目的组件共享.在本文中你可以看到: 从接到需求到深入 ...