Jackson反序列化多态类型绑定

背景

在实际项目中,有时候会遇到,同一个实体对应多个不同的实体类的情况,因此在restful中经常需要定义不同的接口,因为json本身不携带类型信息,但是实际上多个接口从功能层面上来说是一样的,只是返回的结构略有不同,因为这种方式不是很好的处理方式

目标

能否将多个接口合并成一个?尽快他们的返回结构有所区别

方案

在常用的语言中,其实都是可以的,比如javascript/php/python天然就支持的,最终都是反序列为object/array等

在java中,稍微有些区别,默认也可以反序列为Map及其扩展类(JSONObject, ObjectNode等)但是表意性不好,我们期望的是尽可能的从接口定义上获取到完成的类型信息,反序列化时也尽可能的解析成具体的对象

实际上Jackson本身支持这种操作。

具体操作步骤如下

首先,我们需要定义一个接口,将其实现类信息确定

less 复制代码
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type"
)
@JsonSubTypes({
    @JsonSubTypes.Type(value = AUserSessionDTO.class, name = UserSession.TYPE_A),
    @JsonSubTypes.Type(value = BUserSessionDTO.class, name = UserSession.TYPE_B),
})
public interface UserSession {

  String TYPE_A = "A";

  String TYPE_B = "B";
}

JsonTypeInfo中property用于确定具体根据json中的哪个字段来确定对应实现类

JsonSubTypes是一组规则,确定了type的取值范围以及和具体实现类之间的映射关系

接下来定义实现类信息

typescript 复制代码
public class AUserSessionDTO implements UserSession {

  private final String type = UserSession.TYPE_A;

  private String propertyA1;

  private String propertyA2;

  private String propertyA3;

  // ...
  private Integer propertyAN;
}
typescript 复制代码
public class BUserSessionDTO implements UserSession {

  private final String type = UserSession.TYPE_B;

  private String propertyB1;

  private String propertyB2;

  private String propertyB3;

  // ...
  private Integer propertyBN;
}

至此,所有步骤完成,当使用jackson做反序列化时,会自动根据type来反序列化为对应的实现类

相关推荐
kfyty72528 分钟前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎30 分钟前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄31 分钟前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
Moment35 分钟前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
忆~遂愿1 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds1 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹1 小时前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚1 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言
Cobyte1 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc
Ro Jace2 小时前
计算机专业基础教材
java·开发语言