前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何通过Jackson注解@JsonTypeInfo解决多态反序列化问题?

如何通过Jackson注解@JsonTypeInfo解决多态反序列化问题?

原创
作者头像
码农架构
修改2021-06-15 10:56:33
4.1K0
修改2021-06-15 10:56:33
举报
文章被收录于专栏:码农架构码农架构

Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库。有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制。

它提供了很多的JSON数据处理方法、注解,也包括流式API、树模型、数据绑定,以及复杂数据类型转换等功能。它虽然简单易用,但绝对不是小玩具。

本篇主要介绍一下最近遇到的一个问题,在Java 类继承的情况下如何实现父类及子类的JSON序列化与反序列化。

继承关系对象构建

代码语言:javascript
复制
public abstract class Shape {
}
代码语言:javascript
复制
@Data
public class Circle extends Shape {
    int radius;

    public static Circle of(int radius) {
        Circle circle = new Circle();
        circle.setRadius(radius);
        return circle;
    }
}
代码语言:javascript
复制
@Data
public class Rectangle extends Shape {
    private int w;
    private int h;

    public static Rectangle of(int w, int h) {
        Rectangle rectangle = new Rectangle();
        rectangle.setW(w);
        rectangle.setH(h);
        return rectangle;
    }
}
代码语言:javascript
复制
@Data
public class View {
    private List<Shape> shapes;
}

序列化与反序列化测试

下面开始序列化和反序列化一个View实例

最终在控制台的输出结果如下:序列化的过程是正常的,但是反序列化的时候报错了。

抛出异常的主要原因是我们用来接收反序列化的结果时,使用的是List<Shape>,Java程序并不明确的知道,这个ShapeCircle,还是Rectangle。所以无法将字符串正确的反序列化为java对象。

@JsonTypeInfo注解加到父类定义上

为了解决上面的这种继承关系对象的反序列化出现的问题,jackson为我们提供了JsonTypeInfo注解,把它加在父类定义上面即可。

在父类定义上面加上@JsonTypeInfo注解之后,序列化与反序列化的输出结果如下。

值得注意的是在序列化之后的java字符串中,每个Json对象都包含了一个新的属性@class,这也是该对象在继承关系下能够反序列化为正确的java对象(@class的值的类对象)的关键所在。

@JsonTypeInfo注解加到包含父类的成员变量上面

@JsonTypeInfo注解不仅可以加在父类的定义上面,也可以加到包含父类的成员变量上面。序列化和反序列化的结果和上面内容是一样的。

如果该注解同时作用在类和属性上,则以使用在属性上的注解为准,因为它被认为更具体。

需要特别说明的是,当@JsonTypeInfo在属性(字段,方法)上使用时,此注解适用于值。

当在集合类型(List,Map,Array)上使用时,它将应用于元素,而不是集合本身。

对于非集合类型,没有区别。

也就是说,在上面的代码中,当我们将其用于“shapes”的list时,它是应用于list里的每个元素(shape),而不是list类型本身。

原文地址:如何通过Jackson注解@JsonTypeInfo解决多态反序列化问题?

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 继承关系对象构建
    • 序列化与反序列化测试
      • @JsonTypeInfo注解加到父类定义上
        • @JsonTypeInfo注解加到包含父类的成员变量上面
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档