欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

系列文章汇总

本篇概览

本文是《jackson学习》系列的第四篇,前面学习了常用API,可以执行最基本的序列化和反序列化操作,接下来要学习的就是jackson强大的注解能力,本篇要学的是root对象特性,主要内容如下:

  1. 关于root对象
  2. 测试用的POJO类
  3. 序列化实战
  4. 反序列化实战

关于root对象(WRAP_ROOT_VALUE)

  1. 对于只有id和name两个字段的POJO实例来说,正常的序列化结果如下:
{
"id" : 1,
"name" : "book"
}
  1. jackson在序列化时,可以在上述json外面再包裹一层,官方叫做WRAP_ROOT_VALUE,本文中叫做root对象,如下所示,整个json的只有一个键值对,key是aaabbbccc,value内部才是POJO实例的id和name字段的值:
{
"aaabbbccc" : {
"id" : 2,
"name" : "food"
}
}

提前小结

root对象特性提前做个小结,这样如果您时间有限,仅看这一节即可:

  • 先看序列化场景:
  1. 执行下面代码,jackson在序列化时会增加root对象:
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
  1. root对象的key,默认是实例的类名,如果实例有JsonRootName注解,就是该注解的value值;
  2. root对象的value如下所示,相当于不支持root对象时的序列化结果:
{
"id" : 1,
"name" : "book"
}
  • 再看反序列化场景:
  1. 执行下面代码,jackson在反序列化时会先解析root对象:
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
  1. root对象的key,默认是实例的类名,如果实例有JsonRootName注解,就是该注解的value值;
  2. root对象的value如下所示,相当于不支持root对象时用来反序列化的json字符串:
{
"id" : 1,
"name" : "book"
}

准备两个POJO类

用对比的方式可以更清楚了解JsonRootName的作用,接下来的学习咱们准备两个POJO类,一个没有JsonRootName注解,另一个有JsonRootName注解:

  1. 名为Order1.java的,没有JsonRootName注解:
public class Order1 {
private int id;
private String name;
// 省去get、set、toString方法
...
}
  1. 名为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;

序列化

  1. 需要设置WRAP_ROOT_VALUE属性,jackson才会支持root对象,JsonRootName注解才会发挥作用,设置代码如下:
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
  1. 写一段代码,在不开启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));
}
  1. 执行结果如下,JsonRootName在序列化时的作用一目了然:指定了root对象的key:

反序列化(默认设置)

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



3. 那下面这个字符串能反序列化成Order2对象吗?

{
"aaabbbccc" : {
"id" : 2,
"name" : "food"
}
}
  1. 代码和结果如下图所示,反序列化时jackson并不认识aaabbbccc这个key,因为jackson此时并不支持root对象:

  • 小结:默认情况下,反序列化时json字符串不能有root对象;

反序列化(开启UNWRAP_ROOT_VALUE属性)

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



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

  • 至此,jackson的WRAP_ROOT_VALUE特性就学习完成了,在web开发时这是个很常用的功能,用于在最外面包裹一层,以便整体上添加额外的内容,希望能给您带来参考;

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

欢迎关注公众号:程序员欣宸

微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...

https://github.com/zq2599/blog_demos

jackson学习之四:WRAP_ROOT_VALUE(root对象)的更多相关文章

  1. Jackson学习二之集合类对象与JSON互相转化--转载

    原文地址:http://lijingshou.iteye.com/blog/2003059 本篇主要演示如何使用Jackson对List, Map和数组与JSON互相转换. package com.j ...

  2. jackson学习之一:基本信息

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. jackson学习之二:jackson-core

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. jackson学习之三:常用API操作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. jackson学习之五:JsonInclude注解

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. jackson学习之七:常用Field注解

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. jackson学习之八:常用方法注解

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. jackson学习之九:springboot整合(配置文件)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章汇总 jackson学习之一:基本信息 jac ...

  9. jackson学习之十(终篇):springboot整合(配置类)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. Spring Boot 中使用 Quartz 实现任务调度

    Quartz 概述 Quartz 是 OpenSymphony 开源组织在 Job Scheduling 领域又一个开源项目,它可以与 J2EE. J2SE 应用程序相结合也可以单独使用.Quartz ...

  2. ssms导入excel数据提示未安装插件的解决方法

    今天用ssms导入excel的时候,提示 然后去找了一下解决方案,安装了相对应的插件.但是还是会提示这个问题. 又去找了一下原因,找到一个原因是sqlserver启动的时候是32位的,但是导入需要64 ...

  3. CentOS7 实战源码安装mysql5.7.17数据库服务器

    CentOS7 实战源码安装mysql5.7.17数据库服务器 简介:实战演练mysql数据库服务器的搭建  mysql简介: mysql是一个开源的关系型数据库管理系统,现在是oracle公司旗下的 ...

  4. Android驱动学习-灯光系统总体框架

    Android的app访问硬件的大致流程可以分为一下几个步骤: 我们之前说过Android系统在添加新的硬件的时候需要添加一个接口java文件,通过jni来访问硬件. 这个java是我们自己实现的,我 ...

  5. Qt学习笔记-制作一个文本编辑器

    创建一个MainWindow工程.添加一个TextEdit.垂直布局. 在menu上面创建新的action. 在新建的时候判断文本有没有被修改. 下面,将某个文件打开读入到TextEdit中. 保存文 ...

  6. 数据湖框架选型很纠结?一文了解Apache Hudi核心优势

    英文原文:https://hudi.apache.org/blog/hudi-indexing-mechanisms/ Apache Hudi使用索引来定位更删操作所在的文件组.对于Copy-On-W ...

  7. 为什么import React from 'react',React首字母必须大写?

    很奇怪的是,明明没有用到 React,但是我不得不 import React.这是为什么? import React from 'react'; export default function (pr ...

  8. jupyter安装插件Nbextensions,实现代码提示功能(终极方法)

    jupyter安装插件,实现代码提示功能 第一步 pip install jupyter_contrib_nbextensions -i https://mirrors.tuna.tsinghua.e ...

  9. asp.net core 学习笔记

    项目整体感知 项目初始化 项目启动流程: Program.cs Microsoft.Extensions.Hosting.Host => CreateHostBuilder().UseStart ...

  10. python+sklearn+kaggle机器学习

    python+sklearn+kaggle机器学习 系列教程 0.kaggle 1. 初级线性回归模型机器学习过程 a. 提取数据 b.数据预处理 c.训练模型 d.根据数据预测 e.验证 今天是10 ...