jackson 字段映射_使用 Jackson 处理抽象类的序列化和反序列化

本文介绍了如何使用 Jackson 处理抽象类的序列化和反序列化,包括通过 `@JsonTypeInfo` 和 `@JsonSubTypes` 注解指定 Json 中标识类型的值(CLASS, MINIMAL_CLASS, NAME),以及指定标识符在 Json 中的表现形式(WRAPPER_ARRAY, WRAPPER_OBJECT, EXISTING_PROPERTY)。建议使用逻辑名称作为标识符,减少技术细节泄露并降低耦合。" 125844163,11751555,短视频自媒体攻略:从0到1打造抖音矩阵,"['音视频', '短视频开发', '自媒体运营', '内容营销', '抖音SEO']
摘要由CSDN通过智能技术生成

Json 的序列化和反序列化是我们常见的操作,很多库都提供了这样的能力帮助我们完成这样的操作。但业务有时可能变得稍微有些复杂,需要将一个抽象类的子类实例序列化成一个 Json,也需要将一个 Json 反序列化成一个抽象类。而在反序列化的时候,就需要找到真正的子类。

Jackson 是 Java 中常用的一种进行 Json 序列化和反序列化的库,它能否面对这样的业务呢?

业务假设

假设我们有这样的类结构关系:

c87b2e5ecc002cb625f96fead6037043.png

代码写出来长这样:

package cn.gaoyuexiang.practice.jackson.inheritance;

@Data
public abstract class Ticket {
  private TicketType type;
}

@Data
@EqualsAndHashCode(callSuper=true)
public class BugReportingTicket extends Ticket {
  private String productName;
  private String stepToReproduce;
}

@Data
@EqualsAndHashCode(callSuper=true)
public class QuestionTicket extends Ticket {
  private String description;
}

可以在 https://github.com/kbyyd24/jackson-inheritance-practice[1] 看到完整代码

接下来所有的序列化和反序列化操作,都是针对类型为 Ticket 的变量来执行的,而不考虑真实的类型。

序列化

序列化不会遇到任何挑战。因为不管变量的真实类型是什么,Jackson 总是会通过所有的 getter 方法来找到所有的属性和值,并序列化到 Json 中。

反序列化

反序列化就不同了,因为程序不知道 Json 应该对应到哪一个子类,所以我们会写出这样的代码:

Ticket ticket = new ObjectMapper().readValue(json, Ticket.class);

而抽象类又不能创建出实例,所以这一行代码就会因为这个限制而出错。

为了让这一行代码成功执行,为 ticket 变量找到真正的类型,我们就需要使用 @JsonTypeInfo 注解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值