json 反序列化 父子类型_Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo...
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库。有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制。它提供了很多的JSON数据处理方法、注解,也包括流式API、树模型、数据绑定,以及复杂数据类型转换等功能。它虽然简单易用,但绝对不是小玩具,更多的内容我会写成一个系列,5-10篇文章,请您继续关注我。
本篇文章是系列文章的第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 shapes;
}
二、序列化与反序列化测试
基础的形状类及画面类写完之后,下面的代码是用来完成:对象到Json字符串的序列化过程,和Json字符串反序列化为Java对象的过程代码。
@Test
void testJSON2Object() throws IOException {
ClsRectangle rectangle = new ClsRectangle(7,9); //构建正方形对象
ClsCircle circle = new ClsCircle(8); //构建长方形对象
List 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,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 shapes;
}
欢迎关注我的博客,里面有很多精品合集
本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
json 反序列化 父子类型_Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo...相关推荐
- 老的消息中间件投递失败的类型值_RabbitMQ消息中间件技术精讲11 高级篇四 confirm 确认消息...
RabbitMQ消息中间件技术精讲11 高级篇四 confirm 确认消息 理解Confirm消息确认机制: 消息的确认,是指生产者投递消息后,如果broker收到消息,则会给生产者一个应答: 生产者 ...
- python中的序列类型数据结构元素的切片操作_PythonI/O进阶学习笔记_4.自定义序列类(序列基类继承关系/可切片对象/推导式)...
前言: 本文代码基于python3 Content: 1.python中的序列类分类 2. python序列中abc基类继承关系 3. 由list的extend等方法来看序列类的一些特定方法 4. l ...
- json 反序列化 父子类型_json类序列化与反序列化参考
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Runtime.Ser ...
- json 反序列化 父子类型_Json的序列化和反序列化
一.什么是Json: 中午肚子饿了,到餐厅点餐.向服务员点了几个菜,厨师根据用户的需求,开始烹饪食物,食物烹饪好后,怎么将食物呈现给用户呢?这时就需要用到盛放食物的碗了.用户拿到盛放食物的碗,就可以获 ...
- Spring容器父子类继承关系交给spring容器管理采用@autowired自动装配分析
第一个青春是上帝给的 第二个的青春是靠自己努力的. 在开发项目过程中开发者们可能会遇到这样的问题 @autowired自动装配模式的工作模式是:在springIOC定位所有的Bean后,这个字段需要按 ...
- Redis 总结精讲 看一篇成高手系统 四
本文围绕以下几点进行阐述 1.为什么使用redis 2.使用redis有什么缺点 3.单线程的redis为什么这么快 4.redis的数据类型,以及每种数据类型的使用场景 5.redis的过期策略以及 ...
- 英语四级关于计算机阅读理解,英语四级阅读模拟训练附答案和精讲 第6篇:学习计算机...
阅读训练 There is no denying that students should learn something about how computers work, just as we e ...
- 数据挖掘实战应用案例精讲-【概念篇】数据湖(补充篇)(Data Lake )
目录 前言 几个高频面试题目 数据仓库 VS 数据中台 VS 数据湖之间的对比 数据湖元数据 背景
- 数据分析实战应用案例精讲-【概念篇】数据看板(附实战应用案例)
目录 前言 数据看板基础概念 1.什么是数据看板 2.为什么要做数据看板 1)发现问题
最新文章
- python怎么发送代码文件_python 通过 socket 发送文件的实例代码
- Window Server 2008 R2 安装 Share Point 2013
- mysql 中文搜索插件_支持中文的MySQL 5.1+ 全文检索分词插件
- 使用谷歌身份验证器增强SSH安全
- 基于qt和mysql的地铁线路系统_[源码和文档分享]基于QT实现的可视化地铁换乘查询系统...
- 软件测试菲律宾,英雄联盟手游菲律宾测试资格怎么得 菲律宾测试资格获取攻略[多图]...
- python给定一个整数n、判断n是否为素数_输入一个大于3的整数n,判断它是否为素数...
- iPhone 11系列没5G又没创新 库克的回应听了真是让人没脾气...
- 数据结构练习(08)链表中倒数第k个结点
- 我们做了一款无网远程运维的智能硬件,坐等运维工程师“翻牌”
- 利用JDK自带的keytool生成SSL证书然后导入到SpringBoot
- Ubuntu 16.04 下安装运行 Suricata
- 如何在 Mac 上下载 macOS Monterey public beta 6?
- spring源码:循环依赖源码学习
- 最高响应比优先算法(HRRF)及例题详解
- 科技爱好者周刊:第 98 期
- 虚拟打印机安装后没了该怎么办
- 2021-08-04——实践项目1(书本案例)
- 进攻:设备动作流程(一)
- MT7921方案WIFI6无线网卡驱动编译方法
热门文章
- 对科目***货币 ***未定义汇率差额科目
- 从卖冰箱到卖年夜饭,看海尔智家生态品牌新成果
- 网络游戏红利未减,昆仑万维如何急于转型?
- angularjs http和ajax,AngularJS $ http和$ resource
- 解码python_Python解码
- arcgis 出图背景_ArcGIS中导出数据时老显示导出失败,显示“保存对象时出错”什么原因?...
- 步进电机编写单4拍或4-8拍方式的汇编或c语言控制程序.,(毕业设计)基于单片机的步进电机控制系统(汇编及C语言程序各个)...
- 使用饼图_使用R做饼图展示单细胞的cluster的比例
- cli2弃用了吗 vue_vue-cli 3 和 vue-cli 2的区别
- 【Python学习教程】:装饰器的详细教程,通俗易懂