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

Jackson反序列化多态类型不在我的控制之下

Jackson是一个流行的Java库,用于处理JSON数据的序列化和反序列化。在反序列化过程中,如果遇到多态类型,即父类引用指向子类对象,Jackson默认情况下无法正确地恢复子类的具体类型信息。这是因为JSON数据中通常只包含对象的属性值,而没有类型信息。

为了解决这个问题,Jackson提供了多种解决方案。以下是一些常用的方法:

  1. 使用@JsonTypeInfo注解:通过在父类中添加@JsonTypeInfo注解,可以在序列化和反序列化过程中包含类型信息。具体来说,可以使用@JsonTypeInfo注解的use属性指定类型信息的包含方式,如属性字段、类名等;可以使用@JsonTypeInfo注解的include属性指定类型信息的包含级别,如只包含父类类型、包含子类类型等。这样,在反序列化时,Jackson就能正确地恢复多态类型。
  2. 使用@JsonSubTypes注解:通过在父类中添加@JsonSubTypes注解,可以显式地指定子类的类型信息。具体来说,可以使用@JsonSubTypes注解的value属性指定子类的类型和名称。这样,在反序列化时,Jackson就能根据类型信息正确地恢复多态类型。
  3. 使用@JsonTypeInfo和@JsonSubTypes的组合:可以将上述两种方法结合起来使用,以实现更复杂的多态类型的反序列化。

总结起来,Jackson反序列化多态类型的问题可以通过使用@JsonTypeInfo和@JsonSubTypes注解来解决。这样可以确保在反序列化过程中正确地恢复多态类型的具体子类。

腾讯云提供了丰富的云计算产品和服务,其中包括与Jackson相关的产品。然而,根据要求,我不能提及具体的品牌商和产品链接。您可以通过访问腾讯云官方网站,了解他们的云计算产品和服务,以及与JSON数据处理相关的功能和工具。

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

相关·内容

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

Jackson是Spring Boot(SpringBoot)默认JSON数据处理框架,但是其并不依赖于任何Spring 库。...有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制。 它提供了很多JSON数据处理方法、注解,也包括流式API、树模型、数据绑定,以及复杂数据类型转换等功能。...下面开始序列化和反序列化一个View实例 最终在控制输出结果如下:序列化过程是正常,但是反序列化时候报错了。...@JsonTypeInfo注解加到父类定义上 为了解决上面的这种继承关系对象序列化出现问题,jackson为我们提供了JsonTypeInfo注解,把它加在父类定义上面即可。...原文地址:如何通过Jackson注解@JsonTypeInfo解决多态序列化问题?

4.4K10

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

在有些情况下,Jackson在读入或输出一个成员属性时,所选用类型可能并不是你想要: 当读取(反序列化)时,声明类型可能是一个基本类型,但是你确切地知道应该使用实现类型(ps:也就说,我们需要反序列化后生成对象是实现类型...) 当输出(序列化)时,Jackson默认使用是给定运行时类型;但是你可能不想输出那个类型所有信息,而仅仅是它类型所囊括信息。...②处理多态类型(polymorphic types) 如果你要进行读取、输出操作对象拥有许多可能类型(即表现出多态性),你可能还需要添加一些类型信息。...Jackson在反序列化时(读取JSON数据,生成相应对象)需要这些信息,以便能正确地读取对象类型。...{ “class”:”Impl1”, ”x” : 13 } ]} 注意 这个注解还有很多配置可以进行设置,详细内容请查阅浏览: Javadocs 多态类型处理简介

1.4K61

在Scala项目中使用Spring Cloud

不过仍然有几点需要注意,这些方面包括: Maven依赖 Spring语法 Json序列化 Maven依赖 在Scala项目中,如果仍然使用Maven管理依赖,则它与在Java项目中添加Spring...而对于Spring BootController,在语法上有少许差异,即在值中要使用ScalaArray类型,例如 @RestController @RequestMapping(Array("/"...} Json序列化 添加依赖 Spring Boot使用Jackson作为Json序列化支持,若要在Scala项目也要使用Jackson,则需要添加jackson对scala支持模块: <dependency...属性类型就是前面提及表达式树,它对应Json结构需要支持Json类型多态,即前面代码所示ConditionExpression抽象类型,子类ConditionGroup与Condition拥有不同属性定义...要支持这种Json多态,则必须在抽象类型ConditionExpression上添加如下annotation: @JsonTypeInfo( use = JsonTypeInfo.Id.NAME,

1.6K50

Jackson用树模型处理JSON是必备技能,不信你看

群里问了问,主要原因是它不是静态方法调用,并且方法名取得不那么见名之意… 虽然ObjectMapper在数据绑定上既可以处理简单类型(如Integer、List、Map等),也能处理完全类型(如POJO...但是,若有如下场景它依旧不太好实现: 硕大JSON串中只想要某一个(某几个)属性值而已 临时使用,并不想创建一个POJO与之对应,只想直接使用值即可(类型转换什么自己来就好) 数据结构高度动态化...同样,我们可从读(反序列化)、写(序列化)两个方面来展开。 写(序列化) 将Object写为JsonNode,ObjectMapper给我们提供了三个实用API俩操作它: ?...,上面方法已经给出了使用示例,所以本方法不在赘述你应该不会有意见了吧。...下面以最为常见:读取JSON字符串为例,其它举一三即可。

1.2K20

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

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

2.1K40

Jackson用树模型处理JSON是必备技能,不信你看

但是,若有如下场景它依旧不太好实现: 硕大JSON串中只想要某一个(某几个)属性值而已 临时使用,并不想创建一个POJO与之对应,只想直接使用值即可(类型转换什么自己来就好) 数据结构高度动态化...但是,大多数修改方法都必须通过特定子类类型去调用,这其实是合理。因为在构建/修改某个Node节点时,类型类型信息一般是明确,而在读取Node节点时大多数时候并不 太关心节点类型。...同样,我们可从读(反序列化)、写(序列化)两个方面来展开。...,上面方法已经给出了使用示例,所以本方法不在赘述你应该不会有意见了吧。...下面以最为常见:读取JSON字符串为例,其它举一三即可。

1.7K30

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

,默认情况下,Jackson假定对象类型有一个无参构造方法,它会先调用该构造方法创建对象,然后再解析输入源进行反序列化。...在标准序列化中,可以自动处理引用同一个对象、循环引用情况,反序列化时,可以自动忽略不认识字段,可以自动处理继承多态,但Jackson都不能自动处理,这些情况都需要进行配置 标准序列化结果是二进制、...不可读,但XML/JSON格式是可读,有时我们希望控制这个显示格式 默认情况下,反序列时,Jackson要求类有一个无参构造方法,但有时类没有无参构造方法,Jackson支持配置其他构造方法 针对这些场景...Jackson也不能自动处理多态情况,我们看个例子,有四个类,定义如下,我们忽略了构造方法和getter/setter方法: static class Shape { } static class...,输出为: { "shapes" : [ { "r" : 10 }, { "l" : 5 } ] } 这个输出看上去是没有问题,但由于输出中没有类型信息,反序列化时,Jackson

4.7K80

穿越到东汉末年Jackson

大家好,Jackson。 星光灿烂,风儿轻轻。...Gson: 吾观取汉上之地,易如掌。主刘豫州躬行仁义,不忍夺同宗之基业,故力辞之。刘琮孺子,听信佞言,暗自投降,致使曹操得以猖獗。...比如guava中定义数据类型,比如kotlin语言Immutable类型等,比如java8 引入新日期时间类型和Optional都已经有支持模块。...); // 设置Date类型序列化及反序列化格式 om.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"...,其实之前都是用fastjson,但是后来fastjson漏洞太多了,总是要升级,所以我换成了jackson,觉得吧一个项目,最好是用一个工具,而且jackson对xml系列化也支持,并且是SpringMvc

1.9K20

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

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

3.7K20

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

✍前言 各位好,是YourBatman。从本文起,终于要和Jackson“高级”部分打交道了,也就是数据绑定jackson-databind模块。...内容 使用Feature进行定制 使用可插拔com.fasterxml.jackson.databind.Module模块来扩展/丰富功能 它还支持更高级对象概念:比如多态泛型、对象标识 它还充当了更为高级...小贴士:树模型会单独成文介绍,体现出它重要性 写(序列化) 提供writeValue()系列方法用于写数据(可写任何类型),也就是我们常说序列化。 ?...--------写POJO---------- {"name":"A哥","age":18} 读(反序列化) 提供readValue()系列方法用于读数据(一般读字符串类型),也就是我们常说序列化。...对于泛型擦除情况,解决思路是hold住泛型类型,这样反序列化时候才不会抓瞎。但凡只要一抓瞎,Jackson就木有办法只能采用通用/默认类型去装载喽。

1K10

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

关注公众号【BAT乌托邦】逐个击破,深入掌握,拒绝浅尝辄止。 [20200728184059505.png] ✍前言 各位好,是YourBatman。...JSON内容 - 使用Feature进行定制 - 使用可插拔com.fasterxml.jackson.databind.Module模块来扩展/丰富功能 它还支持更高级对象概念:比如多态泛型...小贴士:树模型会单独成文介绍,体现出它重要性 写(序列化) 提供writeValue()系列方法用于写数据(可写任何类型),也就是我们常说序列化。...--------写POJO---------- {"name":"A哥","age":18} 读(反序列化) 提供readValue()系列方法用于读数据(一般读字符串类型),也就是我们常说序列化。...对于泛型擦除情况,解决思路是hold住泛型类型,这样反序列化时候才不会抓瞎。但凡只要一抓瞎,Jackson就木有办法只能采用通用/默认类型去装载喽。

1.4K30

二、jackson-core之流式API与JsonFactory、JsonGenerator、JsonParser

类型是:VALUE_STRING WHITE ==============token类型是:START_ARRAY 篮球 football 核心API精讲 jackson-core内核模块里虽然有众多类...JsonGenerator:用来生成Json格式内容序列化) JsonParser:读取Json格式内容(返序列化,必须是Json格式) Demo案例中介绍了使用Streaming API完成最常规...JsonFactory"); } } 写个ServiceLoader配置文件: 运行如上程序,可以看见控制台上有输出: 是自定义JsonFactory ......这是很容易理解,毕竟反序列化一般都是比序列化麻烦很多。...为了扫清困惑,下面专门针对它们附加一个示例以辅助理解 readValueAs()系列方法Demo示例 该方法将JSON内容反序列化为非容器类型(但可以是数组类型),通常是一个bean,一个数组或包装器类型

1.2K21

Kubernetes官方java客户端之二:序列化和反序列化问题

相关序列化和反序列化处理时,使用了Gson注解,因此上述Bean实例在SpringBoot中涉及到JSON处理时,可能会有问题(这时只能说可能),例如RestController返回对象,会被Jackson...Jackson会执行getStrValue方法,篇幅原因就不在此展开了,简单提一下,在java客户端BeanPropertyWriter类中,选择方法逻辑如下图,红框中展示了判定逻辑,此处getStrValue...方法命中了该逻辑,如果您尝试用在红框处打上断点观察,会发现有很多方法都符合此条件: 解决问题思路 这里,解决问题思路有两个: 让Jackson序列化时候,能够调用正确方法,以IntOrString...为例,如果此时内部保存int型数据,就应该执行其getIntValue方法即可; Bean中使用了Gson注释,就是打算用Gson来处理序列化和反序列化操作,因此序列化和反序列化地方都改用Gson处理...项目,请避免Jackson参与K8S官方java客户端bean序列化和反序列化操作,以上面出现Controller代码为例,不要直接将V1PodList实例返回,您可以选择先用Gson序列化成JSON

1.1K30

Kubernetes官方java客户端之二:序列化和反序列化问题

null, null, null, null, null, null, null, null); return v1PodList; } 上述代码运行起来,在浏览器访问该接口时,控制台抛出以下错误...] 至于为什么Jackson会执行getStrValue方法,篇幅原因就不在此展开了,简单提一下,在java客户端BeanPropertyWriter类中,选择方法逻辑如下图,红框中展示了判定逻辑,...此处getStrValue方法命中了该逻辑,如果您尝试用在红框处打上断点观察,会发现有很多方法都符合此条件: [在这里插入图片描述] 解决问题思路 这里,解决问题思路有两个: 让Jackson序列化时候...,因此序列化和反序列化地方都改用Gson处理; 上述两个思路,选择了第二种,毕竟第一种太难了......,对于使用Jackson项目,请避免Jackson参与K8S官方java客户端bean序列化和反序列化操作,以上面出现Controller代码为例,不要直接将V1PodList实例返回,您可以选择先用

1.3K30

Redis 与序列化

如果我们要把一栋房子从一个地方运输到另一个地方去,序列化就是把房子拆成一个个砖块放到车子里,然后留下一张房子原来结构图纸,反序列化就是我们把房子运输到了目的地以后,根据图纸把一块块砖头还原成房子原来面目的过程...什么情况下需要序列化 通过上面想你已经知道了凡是需要进行“跨平台存储”和”网络传输”数据,都需要进行序列化。...Jackson2JsonRedisSerializer:使用Jackson库将对象序列化为JSON字符串。优点是速度快,序列化字符串短小精悍,不需要实现Serializable接口。...但缺点也非常致命,那就是此类构造函数中有一个类型参数,必须提供要序列化对象类型信息(.class对象)。通过查看源代码,发现其只在反序列化过程中用到了类型信息。...你也可以用 StringRedisTemplate,那么你 set 所有数据都会被 toString 一下再存到 redis 里。但这个 toString 不一定能解析回来。

2.1K40

【漏洞预警】Jackson-databind远程代码执行(CVE-2019-12384)预警通告

该漏洞是由于Jackson黑名单过滤不完整而导致,当开发人员在应用程序中通过ObjectMapper对象调用enableDefaultTyping方法时,程序就会受到此漏洞影响,攻击者就可利用构造包含有恶意代码...json数据包对应用进行攻击,直接获取服务器控制权限。...目前针对该漏洞利用POC已经公开,请受影响用户及时更新版本进行修复,漏洞利用成功截图如下: ?...建议开发人员排查Jackson-databind组件引入情况,包括是否引入以及版本详情,并且排查代码中是否调用了enableDefaultTyping方法。...2.9.9.1 另外,Jackson-dababind最新主要版本(3.x)将使用新API,该API layer可以提供一种基于白名单序列化方式来处理多态

1K10
领券