首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用带有传递的派生类的readValue反序列化Jackson中的多态类型

在Jackson中,使用带有传递的派生类的readValue方法来反序列化多态类型。这种情况下,Jackson需要额外的信息来确定要实例化的具体子类类型。

为了实现这个目标,Jackson提供了多种解决方案,其中最常用的是使用@JsonTypeInfo注解。@JsonTypeInfo注解可以在父类中使用,用于指定子类的类型信息。具体来说,它有以下几个重要的属性:

  1. use:指定类型信息的使用方式,可以是JsonTypeInfo.Id.CLASSJsonTypeInfo.Id.NAMEJsonTypeInfo.Id.MINIMAL_CLASS。其中,JsonTypeInfo.Id.CLASS使用全限定类名作为类型信息,JsonTypeInfo.Id.NAME使用自定义名称作为类型信息,JsonTypeInfo.Id.MINIMAL_CLASS使用简化类名作为类型信息。
  2. include:指定类型信息的包含方式,可以是JsonTypeInfo.As.PROPERTYJsonTypeInfo.As.EXISTING_PROPERTYJsonTypeInfo.As.WRAPPER_OBJECTJsonTypeInfo.As.WRAPPER_ARRAYJsonTypeInfo.As.EXTERNAL_PROPERTY。其中,JsonTypeInfo.As.PROPERTY将类型信息作为属性添加到JSON中,JsonTypeInfo.As.WRAPPER_OBJECT将类型信息作为JSON对象的属性添加,JsonTypeInfo.As.WRAPPER_ARRAY将类型信息作为JSON数组的第一个元素添加。
  3. property:当include属性为JsonTypeInfo.As.PROPERTYJsonTypeInfo.As.EXTERNAL_PROPERTY时,指定类型信息的属性名称。
  4. visible:指定类型信息是否可见,默认为true

下面是一个示例,演示如何使用@JsonTypeInfo注解来反序列化多态类型:

代码语言:txt
复制
public class Animal {
    private String name;

    // getters and setters
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Dog.class, name = "dog"),
    @JsonSubTypes.Type(value = Cat.class, name = "cat")
})
public abstract class Pet extends Animal {
    // additional properties and methods
}

public class Dog extends Pet {
    private String breed;

    // getters and setters
}

public class Cat extends Pet {
    private int lives;

    // getters and setters
}

在上面的示例中,Animal是父类,Pet是派生类,DogCatPet的子类。@JsonTypeInfo注解指定了类型信息的使用方式为名称,并且将类型信息作为名为"type"的属性添加到JSON中。@JsonSubTypes注解用于指定子类的类型信息。

使用readValue方法反序列化多态类型时,需要提供一个TypeReference对象,以便Jackson能够正确地解析类型信息。下面是一个示例:

代码语言:txt
复制
String json = "{\"type\":\"dog\",\"name\":\"Buddy\",\"breed\":\"Labrador Retriever\"}";

ObjectMapper mapper = new ObjectMapper();
TypeReference<Pet> typeRef = new TypeReference<Pet>() {};

Pet pet = mapper.readValue(json, typeRef);

在上面的示例中,我们将JSON字符串反序列化为Pet对象。根据类型信息"type"的值,Jackson会实例化Dog对象,并将相应的属性值填充到对象中。

推荐的腾讯云相关产品:腾讯云对象存储(COS),它是一种高可用、高可靠、低成本的云存储服务,适用于存储和处理任意类型的文件和数据。您可以通过以下链接了解更多信息:腾讯云对象存储(COS)

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

(63) 实用序列化: JSONXMLMessagePack 计算机程序的思维逻辑

) public T readValue(byte[] src, Class valueType) 在反序列化时,默认情况下,Jackson假定对象类型有一个无参的构造方法,它会先调用该构造方法创建对象...在标准序列化中,可以自动处理引用同一个对象、循环引用的情况,反序列化时,可以自动忽略不认识的字段,可以自动处理继承多态,但Jackson都不能自动处理,这些情况都需要进行配置 标准序列化的结果是二进制、...类上使用如下注解: @JsonIgnoreProperties(ignoreUnknown=true) public class Student { 继承和多态 Jackson也不能自动处理多态的情况,...,反序列化时,Jackson不知道具体的Shape类型是什么,就会抛出异常。..."type",表示对象的实际类型,对Circle类,使用"circle"表示其类型,而对于Square类,使用"square",加了注解后,序列化输出会变为: { "shapes" : [ {

4.9K80
  • Jackson父子类多态处理(注解实现)

    方案二:使用Jackson的多态处理。 1....允许配置多态处理,当进行反序列化时,JSON数据匹配的对象可能有多个子类型,为了正确的读取对象的类型,我们需要添加一些类型信息。...visible(可选,默认为false):是否可见 属性定义了类型标识符的值是否会通过JSON流成为反序列化器的一部分,默认为fale,也就是说,jackson会从JSON内容中处理和删除类型标识符再传递给...的值是一个@JsonSubTypes.Type[]数组,里面枚举了多态类型(value对应子类)和类型的标识符值(name对应@JsonTypeInfo中的property标识名称的值,此为可选值。...智能版:扩展@JsonTypeIdResolver的使用 Jackson 多态序列化可以通过@JsonSubtypes来实现,但总觉得不是很方便,比如新增子类的时候都要去加一下JsonSubTypes

    2.8K40

    二十不惑,ObjectMapper使用也不再迷惑

    JSON内容 - 使用Feature进行定制 - 使用可插拔com.fasterxml.jackson.databind.Module模块来扩展/丰富功能 它还支持更高级的对象概念:比如多态泛型...在应用及开发中,ObjectMapper绝对是最常使用的,也是你使用Jackson的入口,本文就列列它的那些使用场景。...--------写POJO---------- {"name":"A哥","age":18} 读(反序列化) 提供readValue()系列方法用于读数据(一般读字符串类型),也就是我们常说的反序列化。...对于泛型擦除情况,解决思路是hold住泛型类型,这样反序列化的时候才不会抓瞎。但凡只要一抓瞎,Jackson就木有办法只能采用通用/默认类型去装载喽。...,需要特别注意泛型擦除问题:若反序列化成为一个集合类型(Collection or Map),泛型会被擦除,此时你应该使用readValue(String content, TypeReference<

    1.7K30

    二十不惑,ObjectMapper使用也不再迷惑

    内容 使用Feature进行定制 使用可插拔com.fasterxml.jackson.databind.Module模块来扩展/丰富功能 它还支持更高级的对象概念:比如多态泛型、对象标识 它还充当了更为高级...在应用及开发中,ObjectMapper绝对是最常使用的,也是你使用Jackson的入口,本文就列列它的那些使用场景。...--------写POJO---------- {"name":"A哥","age":18} 读(反序列化) 提供readValue()系列方法用于读数据(一般读字符串类型),也就是我们常说的反序列化。...对于泛型擦除情况,解决思路是hold住泛型类型,这样反序列化的时候才不会抓瞎。但凡只要一抓瞎,Jackson就木有办法只能采用通用/默认类型去装载喽。...,需要特别注意泛型擦除问题:若反序列化成为一个集合类型(Collection or Map),泛型会被擦除,此时你应该使用readValue(String content, TypeReference<

    1.2K10

    穿越到东汉末年的Jackson

    比如guava中定义的数据类型,比如kotlin语言Immutable的类型等,比如java8 引入的新日期时间类型和Optional都已经有支持的模块。...@JsonPropertyOrder 我们可以使用 @JsonPropertyOrder注释来指定序列化属性的顺序。...我们将使用 @JsonSerialize通过CustomDateSerializer序列化eventDate属性: image.png 这是简单的自定义 Jackson 序列化程序: image.png...让我们通过一个简单的例子来看看这个注解是如何工作的: image.png 这里我们有一个 POJO,我们想将带有fName、f_name和firstName 等值的JSON 反序列化到 POJO的firstName..., false); // 注册一个时间序列化及反序列化的处理模块,用于解决jdk8中localDateTime等的序列化问题 om.registerModule(new

    2K20

    除了FastJson,你也应该了解一下Jackson(一)

    当然除了Jackson,在Java中同类型的优秀的库也有很多,比如: Gson json-io Genson 关于哪一个最好或者哪一个最流行,没有明确的答案。...本文主要讲解我们处理Json中最常见的两个操作: 将Java对象序列化为JSON JSON字符串反序列化为Java对象 ---- 引入依赖 由于在Spring/SpringBoot中很多组件已经自带了Jackson...:Jackson库最大的优点之一是高度可定制的序列化和反序列化过程。接下来将介绍一些高级特性,其中输入或输出JSON响应可以与生成或使用响应的对象不同。...\" }"; 假设使用如上json字符串来反序列化成Java对象,按照默认解析过程将导致UnrecognizedPropertyException异常,因为其中存在Car类中未包含的新字段year。...JSON数组响应生成我们想要的集合类型。

    1.2K31

    jackson序列化和反序列化中的注解和扩展点大全【收藏】

    12 @JsonTypeInfo 作用:在序列化和反序列化过程中,用于处理多态类型。...使用 @JsonTypeInfo 注解指定了类型信息在序列化和反序列化中的处理方式,并使用 @JsonSubTypes 注解标注了派生类与其对应的类型标识。...16 @JsonIgnoreType 作用: 指示 Jackson 在序列化和反序列化过程中忽略被注解的类型。...通过使用 @JsonIgnoreType 注解,你可以告诉 Jackson 忽略这些类型,从而避免在 JSON 序列化和反序列化过程中处理它们。...请根据具体情况选择适当的模块来使用 3️⃣ Jackson 库的扩展点 Jackson 库提供了一些扩展点,使得用户可以扩展序列化和反序列化过程中的行为和选项。

    3.3K10

    java typereference_Java泛型 | Jackson TypeReference获取泛型类型信息「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。 前言 Jackson是一个比较流行的Json序列化和反序列化框架。...本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化,及TypeReference的实现原理。...对于获取泛型类型信息的场景,TypeReference是一个可以参考的通用解决方案。 实例 Jackson ObjectMapper的readValue可以将Json字符串反序列化为Java对象。...理想的实现方式是告诉ObjectMapper的readValue方法,我要的是List,帮我反序列化成这个类型。...Class的genericInfo: 总结Jackson ObjectMapper 提供了TypeReference支持对泛型对象的反序列化; 对于获取泛型类型信息的场景,TypeReference是一个可以参考的通用解决方案

    2.7K10

    Jackson笔记

    简介 Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。...Jackson 社 区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一 。...注解 - 输出 JSON 字段 如果一个对象中某个字段中的值是 JSON,输出整个对象会有问题,这时我们可以使用注解 @JsonRawValue,无转换的将属性值写入到json 字符串中。...注解 - 类型转换 如果输入输出 JSON 时需要类型转换,我们可以使用注解 @JsonDeserialize 和 @JsonSerialize 序列化类 public class BooleanToIntSerializer...在 JSON 中我们可以使用 JsonNode 读取 JSON 的数据转换为节点对象,但是 XML 中读取失败,暂时还没找到原因。

    12K50

    Jackson详解

    一、Jackson介绍 Jackson库的核心功能是将Java对象转换为json字符串(序列化)以及将json字符串转换为Java对象(反序列化) SpringMVC默认json解析器便是Jackson...与其他Java的json的框架相比 Jackson 解析大的json文件速度比较快 Jackson 运行时占用内存比较低,性能比较好 Jackson 有灵活的API,可以很容易进行扩展和定制...value设置的名称 序列化根据index属性排序,反序列化还是类自上而下的顺序 只读属性可以序列化,只写属性可以反序列化(读和写是相对内存中对象来理解的) 2、@JsonAlias 在反序列化的时候可以让...List泛型 可以使用CollectionType类型反序列化,也可以构造TypeReference反序列化 @Test public void test7() throws JsonProcessingException...id=1, name=张三1), User(id=2, name=张三2)] 1.2、反序列化Map泛型 可以使用MapType类型反序列化,也可以构造TypeReference反序列化 @Test public

    14110

    重学springboot系列之JSON处理工具类

    -- FastJSON、Gson和Jackson对比 开源的Jackson:SpringBoot默认是使用Jackson作为JSON数据格式处理的类库,Jackson在各方面都比较优秀,所以不建议将Jackson...---- 在Spring中注解方法使用Jackson jackson主要的作用是: 什么叫序列化与反序列化?...反序列化:在客户端将请求数据上传到服务端的时候,自动的处理JSON数据对象中的字符串、数字,将其转换为包含Date类型、Integer等类型的对象。...序列化:按照指定的格式、顺序等将实体类对象转换为JSON字符串 所以我们下面就给大家介绍一下jackson的常用注解的使用方法,帮助我们进行序列化和反序列化工作。...Ademo.class); 当JSON字符串代表的对象的字段多于类定义的字段时,使用readValue会抛出UnrecognizedPropertyException异常,在类的定义处加上@JsonIgnoreProperties

    2.4K11

    都是微服务的天下了,还有不知道 JSON 的程序员吗?

    1.2.2 数组   数组是值(value)的有序集合。一个数组以 [ 左中括号开始, ] 右中括号结束。值之间使用 , 逗号 分隔。...1.2.4 字符串   字符串(string)是由双引号包围的任意数量 Unicode 字符的集合,使用反斜线转义。...1.3 Java 中的 JSON   Java 中并没有内置 JSON 的解析,因此使用 JSON 需要借助第三方类库。...若为作用在 set/get 方法上,反序列化时不会赋值给属性 format 用在 Date 类型的字段来格式化时间格式 serialize、deserialize 布尔类型, 在序列化的时候就不包含这个字段了...JsonInclude.Include.NON_NULL:属性为 null 不参与序列化 @JsonProperty 属性使用的注解,用来表示外部属性名字,就是使用别名序列化,而不是对象的名字。

    4.5K20
    领券