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

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 注解。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值