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

Jackson多态序列化问题。忽略EXTERNAL_PROPERTY类型信息。

Jackson多态序列化问题是指在使用Jackson库进行对象序列化时,对于包含多态类型的对象,可能会遇到的一些问题。

多态类型是指一个父类可以有多个子类,而在序列化过程中,需要将这些子类对象正确地转换为对应的父类对象。然而,由于Java的泛型擦除机制,导致在序列化时无法准确地获取对象的实际类型信息,从而可能导致序列化结果不符合预期。

为了解决这个问题,Jackson提供了多种解决方案:

  1. 使用@JsonTypeInfo注解:通过在父类上使用@JsonTypeInfo注解,可以指定序列化时包含类型信息。具体使用方式如下:@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes({ @JsonSubTypes.Type(value = SubClassA.class, name = "subclassA"), @JsonSubTypes.Type(value = SubClassB.class, name = "subclassB") }) public abstract class ParentClass { // 父类的属性和方法 }在上述示例中,@JsonTypeInfo注解指定了类型信息的包含方式为属性(property),属性名为"type"。@JsonSubTypes注解指定了子类的类型和对应的名称。
  2. 自定义序列化器和反序列化器:通过实现JsonSerializer和JsonDeserializer接口,可以自定义对象的序列化和反序列化过程。具体使用方式如下:public class ParentClassSerializer extends JsonSerializer<ParentClass> { @Override public void serialize(ParentClass value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 自定义序列化逻辑 } } public class ParentClassDeserializer extends JsonDeserializer<ParentClass> { @Override public ParentClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // 自定义反序列化逻辑 } }然后,在父类上使用@JsonSerialize和@JsonDeserialize注解指定自定义的序列化器和反序列化器。
  3. 使用Mix-in注解:通过在一个独立的类上使用@JsonSerialize和@JsonDeserialize注解,并在这个类中定义父类的序列化和反序列化方式,可以解决多态序列化问题。具体使用方式如下:@JsonSerialize(using = ParentClassSerializer.class) @JsonDeserialize(using = ParentClassDeserializer.class) public abstract class ParentClass { // 父类的属性和方法 }在上述示例中,@JsonSerialize注解指定了自定义的序列化器,@JsonDeserialize注解指定了自定义的反序列化器。

以上是解决Jackson多态序列化问题的几种常用方法。根据具体的业务场景和需求,选择合适的方法来解决多态序列化问题。

腾讯云相关产品和产品介绍链接地址:

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

相关·内容

如何通过Jackson注解@JsonTypeInfo解决多态序列化问题

有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制。 它提供了很多的JSON数据处理方法、注解,也包括流式API、树模型、数据绑定,以及复杂数据类型转换等功能。...本篇主要介绍一下最近遇到的一个问题,在Java 类继承的情况下如何实现父类及子类的JSON序列化与反序列化。...@JsonTypeInfo注解加到父类定义上 为了解决上面的这种继承关系对象的反序列化出现的问题jackson为我们提供了JsonTypeInfo注解,把它加在父类定义上面即可。...当在集合类型(List,Map,Array)上使用时,它将应用于元素,而不是集合本身。 对于非集合类型,没有区别。...原文地址:如何通过Jackson注解@JsonTypeInfo解决多态序列化问题

4.5K10

JSON 多态序列化属性类型丢失问题

一、背景 工作中有时候会遇到一个类定义了某个类型的父类作为成员变量,实际存放的为某个子类型, JSON 反序列化后,属性丢失的情况。 如果你赶时间,可以直接跳到第三部分看解决方案。...=Parent(name=张三, sex=男)) 这样存在的问题: 1、有时候我们会依据 Parent 的具体子类型来执行不同的策略,由于无法确定类型,给我们的编码带来了困扰 2、反序列化时,由于无法感知序列化时...Parent 类的具体类型,反序列化丢失了 other 成员变量的值。...三、解决办法 3.1 将子类型写入 JSON 字符串 先说一个常规做法。 如果我们在序列化时将具体的子类型写入到 JSON 字符串中,反序列化时就可以使用该子类型对其进行反序列化。...四、总结 本文主要讲 JSON 多态序列化属性或类型丢失问题,并提供了几种解决方案,希望对大家有帮助。

3.8K20

Jackson常用注解详解1 初级2 中级

1 初级 我们从几个简单的使用场景开始:重命名属性,忽略属性,以及修改属性所使用的类型。...在有些情况下,Jackson在读入或输出一个成员属性时,所选用的类型可能并不是你想要的: 当读取(反序列化)时,声明的类型可能是一个基本类型,但是你确切地知道应该使用的实现类型(ps:也就说,我们需要反序列化后生成的对象是实现类型的...) 当输出(序列化)时,Jackson默认使用的是给定的运行时类型;但是你可能不想输出那个类型的所有信息,而仅仅是它的父类型所囊括的信息。...②处理多态类型(polymorphic types) 如果你要进行读取、输出操作的对象拥有许多可能的子类型(即表现出多态性),你可能还需要添加一些类型信息。...Jackson在反序列化时(读取JSON数据,生成相应的对象)需要这些信息,以便能正确地读取对象的类型

1.4K61

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

在标准序列化中,可以自动处理引用同一个对象、循环引用的情况,反序列化时,可以自动忽略不认识的字段,可以自动处理继承多态,但Jackson都不能自动处理,这些情况都需要进行配置 标准序列化的结果是二进制、...忽略字段 在Java标准序列化中,如果字段标记为了transient,就会在序列化中被忽略,在Jackson中,可以使用以下两个注解之一: @JsonIgnore:用于字段, getter或setter...反序列化忽略未知字段 在Java标准序列化中,反序列化时,对于未知字段,会自动忽略,但在Jackson中,默认情况下,会抛异常。...Jackson也不能自动处理多态的情况,我们看个例子,有四个类,定义如下,我们忽略了构造方法和getter/setter方法: static class Shape { } static class...,输出为: { "shapes" : [ { "r" : 10 }, { "l" : 5 } ] } 这个输出看上去是没有问题的,但由于输出中没有类型信息,反序列化时,Jackson

4.7K80

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

方案一:Controller层接收的是String类型,然后通过手动的方式来进行反序列化为子类对象。 方案二:使用Jackson多态处理。 1....允许配置多态处理,当进行反序列化时,JSON数据匹配的对象可能有多个子类型,为了正确的读取对象的类型,我们需要添加一些类型信息。...defaultImpl(可选):如果类型识别码不存在或者无效,可以使用该属性来制定反序列化时使用的默认类型。...visible(可选,默认为false):是否可见 属性定义了类型标识符的值是否会通过JSON流成为反序列化器的一部分,默认为fale,也就是说,jackson会从JSON内容中处理和删除类型标识符再传递给...智能版:扩展@JsonTypeIdResolver的使用 Jackson 多态序列化可以通过@JsonSubtypes来实现,但总觉得不是很方便,比如新增子类的时候都要去加一下JsonSubTypes

2.2K40

用了几年的 Fastjson,我最终替换成了Jackson

jackson1是已经过时的框架,因此可以忽略,cheshire和json-simple排名尚且不如fastjson,也忽略,剩余jackson2、gson以及org.json,其中org.json的使用量...序列化时消除对同一对象循环引用的问题 SerializerFeature.DisableCircularReferenceDetect 关闭 SerializationFeature.FAIL_ON_SELF_REFERENCES...{}; // 序列化和反序列化忽略的field,等价于jackson的@JsonIgnoreProperties String[] ignores() default {};...字母顺序排序,等价于jackson的@JsonPropertyOrder.alphabetic() boolean alphabetic() default true; // 反序列化多态类型时...> builder() default Void.class; // 声明这个类型的别名,反序列化多态类型时使用,等价于jackson的@JsonTypeName String typeName

4.8K10

用了几年的 Fastjson,最终替换成了 Jackson

(com.codehuas.jackson) fastjson cheshire json-simple jackson1 是已经过时的框架,因此可以忽略,cheshire 和 json-simple...排名尚且不如 fastjson,也忽略,剩余 jackson2、gson 以及 org.json,其中 org.json 的使用量 (usage) 远小于 jackson2(方便起见,下文均以 jackson...{}; // 序列化和反序列化忽略的field,等价于jackson的@JsonIgnoreProperties String[] ignores() default {};...// 反序列化多态类型时,如果根据其他typeName等方式无法找到正确的子类时,默认使用的子类,等价于jackson的@JsonTypeInfo.defaultImpl() Class builder() default Void.class; // 声明这个类型的别名,反序列化多态类型时使用,等价于jackson的@JsonTypeName String

2.1K30

Java一分钟之-JSON处理:Gson与Jackson

Jackson简介与使用 2.1 特点 性能优异:相比Gson,Jackson在处理大量数据时速度更快,占用内存更少。 功能丰富:支持更多高级特性,如字段忽略、日期格式化等。...常见问题与易错点 3.1 时间格式处理不当 问题:默认情况下,Gson和Jackson可能无法正确处理自定义时间格式。 解决:为特定字段指定日期格式化器,或全局配置日期格式。...3.2 循环引用导致的StackOverflowError 问题:对象间循环引用可能导致序列化时栈溢出。 解决:使用特定配置或注解来忽略循环引用的字段。...3.3 类型不匹配错误 问题:反序列化时,JSON字段类型与Java对象字段类型不匹配。 解决:确保JSON数据类型与Java对象字段类型一致,或使用类型适配器。 4....安全与最佳实践 避免敏感信息泄露:在序列化对象时,注意不要将敏感信息(如密码)暴露到JSON中。 性能考量:根据项目需求选择库,对于高性能要求的应用,优先考虑Jackson

36210

如何再Java POJO转JSON时忽略掉一些属性

前言 在Java开发中有时候某些敏感信息我们需要屏蔽掉,不能被消费这些数据的客户端知道。通常情况下我们会将其设置为null或者空字符"",其实还有其它办法,如果你使用了Jackson的话。...Jackson 如何忽略字段 这里都以 JSON 序列化为例。...如果业务需要批量提供用户信息,即List,我们总不能每次都要遍历一遍吧。Spring Boot内置的Jackson可以很方便的帮我们处理这个问题。...允许忽略字段被反序列化,配置allowSetters为true,反序列化的时候不会被忽略。...) private String secret; 使用@JsonIgnoreType 注解 这个注解是用来直接忽略类型的,如果上面的UserInfo是另外一个 POJO 的属性,我们不希望它被序列化和反序列化

1.6K10

在Scala项目中使用Spring Cloud

不过仍然有几点需要注意,这些方面包括: Maven依赖 Spring的语法 Json的序列化 Maven依赖 在Scala项目中,如果仍然使用Maven管理依赖,则它与在Java项目中添加Spring...} Json的序列化 添加依赖 Spring Boot使用Jackson作为Json的序列化支持,若要在Scala项目也要使用Jackson,则需要添加jackson对scala的支持模块: com.fasterxml.jackson.module jackson-module-scala_2.11</artifactId...,它对应的Json结构需要支持Json类型多态,即前面代码所示的ConditionExpression抽象类型,子类ConditionGroup与Condition拥有不同的属性定义。...要支持这种Json的多态,则必须在抽象类型ConditionExpression上添加如下annotation: @JsonTypeInfo( use = JsonTypeInfo.Id.NAME,

1.7K50

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

内容 使用Feature进行定制 使用可插拔com.fasterxml.jackson.databind.Module模块来扩展/丰富功能 它还支持更高级的对象概念:比如多态泛型、对象标识 它还充当了更为高级...这是典型的泛型擦除问题。该问题只可能出现在读(反序列化)上,不能出现在写上。那么这种问题怎么破?...在解决此问题之前,我们得先对Java中的泛型擦除有所了解,至少知道如下两点结论: Java 在编译时会在字节码里指令集之外的地方保留部分泛型信息 泛型接口、类、方法定义上的所有泛型、成员变量声明处的泛型都会被保留类型信息...,其它地方的泛型信息都会被擦除 此问题在开发过程中非常高频,有了此理论作为支撑,A哥提供两种可以解决本问题的方案供以参考: 方案一:利用成员变量保留泛型 理论依据:成员变量的泛型类型不会被擦除 @Test...对于泛型擦除情况,解决思路是hold住泛型类型,这样反序列化的时候才不会抓瞎。但凡只要一抓瞎,Jackson就木有办法只能采用通用/默认类型去装载喽。

1K10

【Java 进阶篇】揭秘 Jackson:Java 对象转 JSON 注解的魔法

在开始之前,让我们先简要了解一下 Jackson 注解是什么。 Jackson 注解是一组用于配置 Java 对象序列化和反序列化过程的注解。...忽略字段:@JsonIgnore 有时候,我们希望在序列化或反序列化过程中忽略某些字段,这时可以使用 @JsonIgnore 注解。...支持枚举:@JsonEnumDefaultValue 在处理枚举类型时,我们可能会遇到枚举值新增但尚未在代码中处理的情况。...嵌套对象处理:@JsonManagedReference 与 @JsonBackReference 当对象之间存在双向关系时,为了防止无限递归的序列化问题,我们可以使用 @JsonManagedReference...这样,序列化时将优先处理 @JsonManagedReference,而忽略 @JsonBackReference,从而避免了无限递归的问题

32710

Jackson 使用

在反序列化的时候,默认情况下接受输出信息的实体类的字段不能有输入中不存在的,否则会报 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException...如果需要”反序列化集合”的元素为非基本类型,可以通过创建一个空实现的TypeReference实例,将需要反序列化的集合带上泛型信息传递进去,以解决泛型信息无法传递的问题。...READ_ONLY:只允许序列化(get),不允许反序列化(set) READ_WRITE:允许序列化(get)和反序列化(set),无视可见度规则 WRITE_ONLY 只需要在序列化(get)时候忽略...String password; 忽略字段 @JsonIgnore 注解 注解用于排除某个属性,这样该属性就不会被Jackson序列化和反序列化。...JsonIgnoreProperties 注解 @JsonIgnoreProperties(value = {"mobile","name"}) @JsonIgnoreProperties主要用于类上, 表示该字段在序列化和反序列化的时候都将被忽略

1.8K20

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

JSON内容 - 使用Feature进行定制 - 使用可插拔com.fasterxml.jackson.databind.Module模块来扩展/丰富功能 它还支持更高级的对象概念:比如多态泛型...这是典型的泛型擦除问题。该问题只可能出现在读(反序列化)上,不能出现在写上。那么这种问题怎么破?...在解决此问题之前,我们得先对Java中的泛型擦除有所了解,至少知道如下两点结论: Java 在编译时会在字节码里指令集之外的地方保留部分泛型信息 泛型接口、类、方法定义上的所有泛型、成员变量声明处的泛型都会被保留类型信息...,其它地方的泛型信息都会被擦除 此问题在开发过程中非常高频,有了此理论作为支撑,A哥提供两种可以解决本问题的方案供以参考: 方案一:利用成员变量保留泛型 理论依据:成员变量的泛型类型不会被擦除 @Test...对于泛型擦除情况,解决思路是hold住泛型类型,这样反序列化的时候才不会抓瞎。但凡只要一抓瞎,Jackson就木有办法只能采用通用/默认类型去装载喽。

1.5K30

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

---- 在Spring中注解方法使用Jackson jackson主要的作用是: 什么叫序列化与反序列化?...反序列化:在客户端将请求数据上传到服务端的时候,自动的处理JSON数据对象中的字符串、数字,将其转换为包含Date类型、Integer等类型的对象。...@JsonIgnore 加在属性上面,排除某个属性不做序列化与反序列化 @JsonIgnoreProperties(ignoreUnknown =true),将这个注解写在类上之后,就会忽略JSON字符串中存在...@JsonIgnoreProperties({ “xxx”, “yyyy” }) 忽略某些属性不进行序列化 @JsonProperty(anotherName) 为某个属性换一个名称,体现在JSON数据里面...,来应对我们JSON序列化与反序列化中出现的各种问题

2.2K10

揭秘 Jackson:Java 对象转 JSON 注解的魔法

在开始之前,让我们先简要了解一下 Jackson 注解是什么。Jackson 注解是一组用于配置 Java 对象序列化和反序列化过程的注解。...忽略字段:@JsonIgnore有时候,我们希望在序列化或反序列化过程中忽略某些字段,这时可以使用 @JsonIgnore 注解。...支持枚举:@JsonEnumDefaultValue在处理枚举类型时,我们可能会遇到枚举值新增但尚未在代码中处理的情况。...嵌套对象处理:@JsonManagedReference 与 @JsonBackReference当对象之间存在双向关系时,为了防止无限递归的序列化问题,我们可以使用 @JsonManagedReference...这样,序列化时将优先处理 @JsonManagedReference,而忽略 @JsonBackReference,从而避免了无限递归的问题

27600

一篇就够,Jackson的功能原来如此之牛(万字干货)

中,讲了FastJson的基本使用以及存在的不确定性问题,所以最终决定在项目中放弃使用,进而选择市面上比较主流,Spring Boot默认绑定的JSON类库:Jackson。...,使用TypeReference可以明确的指定反序列化类型。...格式化统一配置 在使用ObjectMapper时,会存在一些字段在某些情况下不需要进行序列化或反序列化,同时还可能需要指定格式化的一些信息等。此时,可以通过ObjectMapper进行配置。..., false); //序列化时自定义时间日期格式 mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); //序列化忽略值为...@JsonIgnoreProperties作用于类上,序列化时@JsonIgnoreProperties({“prop1”, “prop2”})会忽略pro1和pro2两个属性。

3.4K31
领券