当前位置: 首页 > article >正文

Jackson中@JsonTypeId的妙用与实例解析

在日常的Java开发中,Jackson库是处理JSON数据的常用工具。其中,@JsonTypeId注解是一个非常实用的功能,它可以帮助我们更好地控制多态类型信息在序列化过程中的表现。今天,我们就来深入探讨一下@JsonTypeId的用法,并通过具体的实例来展示它的强大功能。
一、@JsonTypeId的作用
@JsonTypeId注解用于覆盖在序列化过程中指定的多态类型信息。它通常与@JsonTypeInfo注解配合使用,以实现更灵活的类型标识。通过@JsonTypeId,我们可以自定义类型标识的字段,从而在JSON输出中更清晰地表达对象的实际类型。
二、实例解析
(一)定义抽象类和子类
首先,我们定义一个抽象类Shape,并使用@JsonTypeInfo和@JsonSubTypes注解来指定多态类型信息。
java复制
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes(@JsonSubTypes.Type(value = Rectangle.class, name = “rectangle”))
public abstract class Shape {
}
接下来,定义一个具体的子类Rectangle,并使用@JsonTypeName注解来指定其类型名称。同时,在Rectangle类中添加一个字段typeId,并使用@JsonTypeId注解来覆盖默认的类型标识。
java复制
@JsonTypeName(“rectangle”)
public class Rectangle extends Shape {
@JsonTypeId
private String typeId;
private int w;
private int h;

public Rectangle() {}

public static Rectangle of(String typeId, int w, int h) {
    Rectangle rect = new Rectangle();
    rect.typeId = typeId;
    rect.w = w;
    rect.h = h;
    return rect;
}

@Override
public String toString() {
    return "Rectangle{" +
            "typeId='" + typeId + '\'' +
            ", w=" + w +
            ", h=" + h +
            '}';
}

}
(二)序列化测试
在主类中,我们创建一个Rectangle对象,并使用Jackson的ObjectMapper进行序列化。
java复制
public class ExampleMain {
public static void main(String[] args) throws IOException {
Shape shape = Rectangle.of(“RectShape”, 3, 6);
System.out.println(shape);
System.out.println(“-- serializing --”);
ObjectMapper om = new ObjectMapper();
String s = om.writeValueAsString(shape);
System.out.println(s);
}
}
运行结果如下:
复制
Rectangle{typeId=‘RectShape’, w=3, h=6}
– serializing –
{“RectShape”:{“w”:3,“h”:6}}
(三)对比无@JsonTypeId的情况
如果移除Rectangle类中typeId字段的@JsonTypeId注解,序列化结果会有所不同。
java复制
public class Rectangle extends Shape {
private String typeId;
private int w;
private int h;

// 省略构造方法和toString方法

}
此时,运行主类的代码,输出结果为:
复制
Rectangle{typeId=‘RectShape’, w=3, h=6}
– serializing –
{“rectangle”:{“typeId”:“RectShape”,“w”:3,“h”:6}}
可以看到,没有@JsonTypeId注解时,typeId字段被正常序列化为普通字段,而不会被用作类型标识。
三、总结
通过上述实例,我们可以清楚地看到@JsonTypeId注解的作用。它允许我们在序列化过程中自定义类型标识字段,从而更灵活地控制JSON输出的结构。在实际开发中,合理使用@JsonTypeId可以让我们更好地处理复杂的多态类型场景,提升代码的可读性和可维护性。
希望这篇博客能帮助你更好地理解和使用Jackson中的@JsonTypeId注解。如果你有任何疑问或想法,欢迎在评论区留言交流!


http://www.kler.cn/a/524967.html

相关文章:

  • 嵌入式经典面试题之操作系统(一)
  • 牛客周赛77:A:JAVA
  • 【ComfyUI专栏】通过软件获取PNG图片中的工作流信息
  • h5 网页测试摄像头
  • MySQL 基础学习(3):排序查询和条件查询
  • C语言编译过程全面解析
  • MySQL知识点总结(十四)
  • 计算机网络 IP 网络层 2 (重置版)
  • 物联网智能项目之——智能家居项目的实现!
  • 网络工程师 (7)进程管理
  • 创建要素图层和表视图
  • 爬虫基础(一)HTTP协议 :请求与响应
  • 剑指 Offer II 007. 数组中和为 0 的三个数
  • 每日一题洛谷P1307 [NOIP2011 普及组] 数字反转c++
  • GitHub Actions定时任务配置完全指南:从Cron语法到实战示例
  • 基于Go语言的三甲医院人机与智能体协同环境系统(上.文章部分)
  • JVM01_概述、跨平台原理、分类、三大商业虚拟机
  • 未来无线技术的发展方向
  • Python 切片(Slicing):列表、元组与字符串的高效操作
  • Python爬虫获取item_fee-获得淘宝商品快递费用接口