Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库。有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制。它提供了很多的JSON数据处理方法、注解,也包括流式API、树模型、数据绑定,以及复杂数据类型转换等功能。它虽然简单易用,但绝对不是小玩具,更多的内容我会写成一个系列,5-10篇文章,请您继续关注我。
- 《序列化与反序列化核心用法-JSON框架Jackson精解第1篇》
- 《特殊数据格式处理-JSON框架Jackson精解第2篇》
- 《属性序列化自定义排序与字母表排序-JSON框架Jackson精解第3篇》
- 《@JacksonInject与@JsonAlias注解-JSON框架Jackson精解第4篇》
- 《@JsonCreator自定义反序列化函数-JSON框架Jackson精解第5篇》
- 《Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换》
本篇文章是系列文章的第7篇,主要是为大家介绍一下,在Java 类继承的情况下如何实现父类及子类的JSON序列化与反序列化。
一、继承关系对象构建
首先构建一个ClsShape类表示形状。
public class ClsShape {
}
构建一个ClsCircle 类表示圆形。并添加了一系列的lombok注解,Data表示提供get、set、toString、hashCode等方法;EqualsAndHashCode注解在有继承关系的字类中使用;AllArgsConstructor和NoArgsConstructor分别提供全参和无参构造方法。
@Data
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
public class ClsCircle extends ClsShape {
Integer radius; //弧度
}
构建一个长方形类ClsRectangle ,成员变量width宽度,height高度。
@Data
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
public class ClsRectangle extends ClsShape {
private Integer width;
private Integer height;
}
构建一个ClsView类,表示画面。画面中有很多的ClsShape形状,所以用一个List封装。
@Data
public class ClsView {
private List<ClsShape> shapes;
}
二、序列化与反序列化测试
基础的形状类及画面类写完之后,下面的代码是用来完成:对象到Json字符串的序列化过程,和Json字符串反序列化为Java对象的过程代码。
@Test
void testJSON2Object() throws IOException {
ClsRectangle rectangle = new ClsRectangle(7,9); //构建正方形对象
ClsCircle circle = new ClsCircle(8); //构建长方形对象
List<ClsShape> shapes = new ArrayList<>(); //List<多种形状>
shapes.add(circle);
shapes.add(rectangle);
ClsView view = new ClsView(); //将List放入画面View
view.setShapes(shapes);
ObjectMapper mapper = new ObjectMapper();
System.out.println("-- 序列化 --");
String jsonStr = mapper.writeValueAsString(view);
System.out.println(jsonStr);
System.out.println("-- 反序列化 --");
ClsView deserializeView = mapper.readValue(jsonStr, ClsView.class);
System.out.println(deserializeView);
}
大家看最终在控制台的输出结果如下:序列化的过程是正常的,但是反序列化的时候报错了。
-- 序列化 --
{"shapes":[{"radius":8},{"width":7,"height":9}]}
-- 反序列化 --
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "radius" (class com.example.demo.javabase.ClsShape), not marked as ignorable (0 known properties: ])
at [Source: (String)"{"shapes":[{"radius":8},{"width":7,"height":9}]}"; line: 1, column: 23] (through reference chain: com.example.demo.javabase.ClsView["shapes"]->java.util.ArrayList[0]->com.example.demo.javabase.ClsShape["radius"])
抛出异常的主要原因是我们用来接收反序列化的结果时,使用的是List<ClsShape>
,Java程序并不明确的知道,这个ClsShape形状是圆形ClsCircle,还是正方形ClsRectangle。所以无法将字符串正确的反序列化为java对象。
三、@JsonTypeInfo
注解加到父类定义上
为了解决上面的这种继承关系对象的反序列化出现的问题,jackson为我们提供了JsonTypeInfo注解,把它加在父类定义上面即可。
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
public class ClsShape {
}
在父类定义上面加上@JsonTypeInfo
注解之后,序列化与反序列化的输出结果如下。
-- 序列化 --
{"shapes":[
{"@class":"com.example.demo.javabase.ClsCircle","radius":8},
{"@class":"com.example.demo.javabase.ClsRectangle","width":7,"height":9}
]}
-- 反序列化 --
ClsView(shapes=[ClsCircle(radius=8), ClsRectangle(width=7, height=9)])
值得注意的是在序列化之后的java字符串中,每个Json对象都包含了一个新的属性@class
,这也是该对象在继承关系下能够反序列化为正确的java对象(@class的值的类对象)的关键所在。
四、@JsonTypeInfo
注解加到包含父类的成员变量上面
@JsonTypeInfo
注解不仅可以加在父类的定义上面,也可以加到包含父类的成员变量上面。序列化和反序列化的结果和第三小节中的内容是一样的。
@Data
public class ClsView {
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
private List<ClsShape> shapes;
}
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo的更多相关文章
- Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...
- 转 Redis 总结精讲 看一篇成高手系统-4
转 Redis 总结精讲 看一篇成高手系统-4 2018年05月31日 09:00:05 hjm4702192 阅读数:125633 本文围绕以下几点进行阐述 1.为什么使用redis 2.使用r ...
- Programming In Scala笔记-第十一章、Scala中的类继承关系
本章主要从整体层面了解Scala中的类层级关系. 一.Scala的类层级 在Java中Object类是所有类的最终父类,其他所有类都直接或间接的继承了Object类.在Scala中所有类的最终父类为A ...
- Unity类继承关系 图
UnityEngine(命名空间) 其他命名空间 其他类 Object(类) 其他类(继承自Object) Component(类)(继承自Object) 其他类(继承自Component) Tran ...
- PythonI/O进阶学习笔记_4.自定义序列类(序列基类继承关系/可切片对象/推导式)
前言: 本文代码基于python3 Content: 1.python中的序列类分类 2. python序列中abc基类继承关系 3. 由list的extend等方法来看序列类的一些特定方法 4. l ...
- Idea查看接口或类继承关系
打开想要查看的接口或者类文件,使用快捷键CTRL+H调出Hierarchy窗口 比如,想要查看Exception的类继承关系,首先定位到这个文件,然后调出Hierarchy窗口. 该窗口上面的一排工具 ...
- C# Wpf Shape类继承关系
Path派生于Shape namespace System.Windows.Shapes { public sealed class Path : Shape { // Path 派生于Shape } ...
- 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变
在net中json序列化与反序列化 准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...
- 继承关系下的this关键字
继承关系下的this关键字 在继承关系下,父类中的this关键字并不总是表示父类中的变量和方法.this关键字的四种用法如前文所述,列举如下. 1) this(paras…); 访问其他的构造方法 2 ...
随机推荐
- 初始化文章分类的方法 下拉的layui框
触发时机:页面加载完毕之后 实现步骤: 1.利用$.ajax()发起请求 (找接口文档) 2.在success成功回调里面获取服务器返回的数据,判断一下返回的success是否是0. 3.如果不是0, ...
- 焦大:seo思维进化论(番外)
http://www.wocaoseo.com/thread-54-1-1.html 我已经在博客说了学seo研究算法是愚蠢的行为,但是很多人仍旧来问se的算法问题,其中最多的就是问TF-IDF算法, ...
- 从String类型发散想到的一些东西
值类型 引用类型 值类型表示存储在栈上的类型,包括简单类型(int.long.double.short).枚举.struct定义: 引用类型表示存在堆上的类型,包括数组.接口.委托.class定义: ...
- 04.简单了解一下Redis企业级数据备份方案
一.企业级的持久化的配置策略 (1)每隔1分钟去检查如果超过10000个可以变更,则生成一个快照.RDB最多丢1分钟的数据. save 60 10000 (2)AOF一定要打开,fsync,every ...
- jq cdn地址
百度CDN支持版本2.0.3, 2.0.2, 2.0.1, 2.0.0,1.11.1, 1.10.2, 1.10.1, 1.10.0, 1.9.1, 1.9.0, 1.8.3, 1.8.2, 1.8. ...
- ConcurrentHashMap的size方法是线程安全的吗?
前言 之前在面试的过程中有被问到,ConcurrentHashMap的size方法是线程安全的吗? 这个问题,确实没有答好.这次来根据源码来了解一下,具体是怎么一个实现过程. ConcurrentHa ...
- C005:计算多项式的值
程序: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { float x; do{ printf("E ...
- 20190923-09Linux磁盘分区类 000 017
df 查看磁盘空间使用情况 df: disk free 空余硬盘 1.基本语法 df 选项 (功能描述:列出文件系统的整体磁盘使用量,检查文件系统的磁盘空间占用情况) 2.选项说明 表1-32 选项 ...
- [Java数据结构]Queue
Queue扩展了Collection,它添加了支持根据先进先出FIFO原则对元素排序的方法. 当对Queue调用add和offer方法时,元素始终添加在Queue的末尾:要检索一个元素,就要使用一个元 ...
- JSTL日期格式化用法
JSP Standard Tag LibrariesFormatting and InternationalizationTwo form input parameters, 'date' and ' ...