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...相关推荐

  1. 老的消息中间件投递失败的类型值_RabbitMQ消息中间件技术精讲11 高级篇四 confirm 确认消息...

    RabbitMQ消息中间件技术精讲11 高级篇四 confirm 确认消息 理解Confirm消息确认机制: 消息的确认,是指生产者投递消息后,如果broker收到消息,则会给生产者一个应答: 生产者 ...

  2. python中的序列类型数据结构元素的切片操作_PythonI/O进阶学习笔记_4.自定义序列类(序列基类继承关系/可切片对象/推导式)...

    前言: 本文代码基于python3 Content: 1.python中的序列类分类 2. python序列中abc基类继承关系 3. 由list的extend等方法来看序列类的一些特定方法 4. l ...

  3. json 反序列化 父子类型_json类序列化与反序列化参考

    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Runtime.Ser ...

  4. json 反序列化 父子类型_Json的序列化和反序列化

    一.什么是Json: 中午肚子饿了,到餐厅点餐.向服务员点了几个菜,厨师根据用户的需求,开始烹饪食物,食物烹饪好后,怎么将食物呈现给用户呢?这时就需要用到盛放食物的碗了.用户拿到盛放食物的碗,就可以获 ...

  5. Spring容器父子类继承关系交给spring容器管理采用@autowired自动装配分析

    第一个青春是上帝给的 第二个的青春是靠自己努力的. 在开发项目过程中开发者们可能会遇到这样的问题 @autowired自动装配模式的工作模式是:在springIOC定位所有的Bean后,这个字段需要按 ...

  6. Redis 总结精讲 看一篇成高手系统 四

    本文围绕以下几点进行阐述 1.为什么使用redis 2.使用redis有什么缺点 3.单线程的redis为什么这么快 4.redis的数据类型,以及每种数据类型的使用场景 5.redis的过期策略以及 ...

  7. 英语四级关于计算机阅读理解,英语四级阅读模拟训练附答案和精讲 第6篇:学习计算机...

    阅读训练 There is no denying that students should learn something about how computers work, just as we e ...

  8. 数据挖掘实战应用案例精讲-【概念篇】数据湖(补充篇)(Data Lake )

    目录 前言 几个高频面试题目 数据仓库 VS 数据中台 VS 数据湖之间的对比 数据湖元数据 背景

  9. 数据分析实战应用案例精讲-【概念篇】数据看板(附实战应用案例)

    目录 前言 数据看板基础概念 1.什么是数据看板 2.为什么要做数据看板 1)发现问题

最新文章

  1. python怎么发送代码文件_python 通过 socket 发送文件的实例代码
  2. Window Server 2008 R2 安装 Share Point 2013
  3. mysql 中文搜索插件_支持中文的MySQL 5.1+ 全文检索分词插件
  4. 使用谷歌身份验证器增强SSH安全
  5. 基于qt和mysql的地铁线路系统_[源码和文档分享]基于QT实现的可视化地铁换乘查询系统...
  6. 软件测试菲律宾,英雄联盟手游菲律宾测试资格怎么得 菲律宾测试资格获取攻略[多图]...
  7. python给定一个整数n、判断n是否为素数_输入一个大于3的整数n,判断它是否为素数...
  8. iPhone 11系列没5G又没创新 库克的回应听了真是让人没脾气...
  9. 数据结构练习(08)链表中倒数第k个结点
  10. 我们做了一款无网远程运维的智能硬件,坐等运维工程师“翻牌”
  11. 利用JDK自带的keytool生成SSL证书然后导入到SpringBoot
  12. Ubuntu 16.04 下安装运行 Suricata
  13. 如何在 Mac 上下载 macOS Monterey public beta 6?
  14. spring源码:循环依赖源码学习
  15. 最高响应比优先算法(HRRF)及例题详解
  16. 科技爱好者周刊:第 98 期
  17. 虚拟打印机安装后没了该怎么办
  18. 2021-08-04——实践项目1(书本案例)
  19. 进攻:设备动作流程(一)
  20. MT7921方案WIFI6无线网卡驱动编译方法

热门文章

  1. 对科目***货币 ***未定义汇率差额科目
  2. 从卖冰箱到卖年夜饭,看海尔智家生态品牌新成果
  3. 网络游戏红利未减,昆仑万维如何急于转型?
  4. angularjs http和ajax,AngularJS $ http和$ resource
  5. 解码python_Python解码
  6. arcgis 出图背景_ArcGIS中导出数据时老显示导出失败,显示“保存对象时出错”什么原因?...
  7. 步进电机编写单4拍或4-8拍方式的汇编或c语言控制程序.,(毕业设计)基于单片机的步进电机控制系统(汇编及C语言程序各个)...
  8. 使用饼图_使用R做饼图展示单细胞的cluster的比例
  9. cli2弃用了吗 vue_vue-cli 3 和 vue-cli 2的区别
  10. 【Python学习教程】:装饰器的详细教程,通俗易懂