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

通过父类字段值反序列化Jackson的子类

,可以使用Jackson的多态反序列化功能来实现。具体步骤如下:

  1. 首先,确保你已经引入了Jackson库的相关依赖。
  2. 创建一个父类(BaseClass)和多个子类(ChildClass1、ChildClass2等),并在父类中定义一个字段(type)用于标识子类的类型。
代码语言:txt
复制
public class BaseClass {
    private String type;

    // Getter and Setter
}

public class ChildClass1 extends BaseClass {
    // 子类1的特有字段和方法
}

public class ChildClass2 extends BaseClass {
    // 子类2的特有字段和方法
}
  1. 在进行反序列化时,使用Jackson的ObjectMapper类,并配置一个自定义的DeserializationFeature,使其支持多态反序列化。
代码语言:txt
复制
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  1. 调用ObjectMapper的readValue方法,将JSON字符串反序列化为父类对象。
代码语言:txt
复制
String json = "{\"type\":\"ChildClass1\",\"field1\":\"value1\"}";
BaseClass baseClass = objectMapper.readValue(json, BaseClass.class);
  1. 根据父类对象的type字段值,判断具体的子类类型,并进行类型转换。
代码语言:txt
复制
BaseClass baseClass = objectMapper.readValue(json, BaseClass.class);
if (baseClass instanceof ChildClass1) {
    ChildClass1 childClass1 = (ChildClass1) baseClass;
    // 处理子类1的逻辑
} else if (baseClass instanceof ChildClass2) {
    ChildClass2 childClass2 = (ChildClass2) baseClass;
    // 处理子类2的逻辑
}

这样,通过父类字段值反序列化Jackson的子类就可以实现了。

在腾讯云的产品中,可以使用腾讯云的云函数(SCF)来实现上述功能。腾讯云云函数是一种无服务器计算服务,可以在云端运行代码,无需关心服务器的运维和扩展。你可以使用腾讯云云函数来创建一个函数,将上述代码逻辑封装在函数中,并通过API Gateway等服务触发函数执行。具体的产品介绍和使用方法可以参考腾讯云云函数的官方文档:腾讯云云函数

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

相关·内容

dubbo序列化问题(三)子类覆盖字段hession反序列化获取不到

在进行dubbo开发中遇到一个问题,当是用hession2进行序列化时,子类有相同字段时,hession2反序列化获取不到该字段数据,如下: import java.io.Serializable...} return null; } } 运行该测试程序,输出如下 ChildrenUser [userId=null, addDate=null] 然后我再是用kryo来进行序列化...这个是hession2一个坑,经过查看源码Hessian2InputreadObjectInstance方法 他将属性都读取了 ?...而每次第一次能读取到,然后第二次读取就是null,都被覆盖了,所以输出都是null。 所以解决方案就是去掉子类字段或者字段,或者改用kryo等其他序列化方式。

1.1K40

在NHibernate单表继承模式下通过Repository查询子类

表继承) 其中单表继承是我个人比较常用比较推荐做法。...使用单表继承可以不用Join多个表查询效率高,而且在Domain Model属性提示到或者下降到子类时,数据库模型不用更改。...在NHibernate中经常会遇到通过Repository来查询子类情况,比如现在有一个抽象Employee对象,下面有OfficeUser和Teacher两个具体对象,这两个对象都有其特有的属性...ems = cri.List(); 这里又不一样了,where条件后面跟“Type”是Employee表Discriminator,是一个列名,也就是通过这一列来区分Employee...以上是以最简单了例子说明了如果通过查询具体子类方法,实际项目中肯定比这个查询要复杂,但是只要记住了这三种查询要点,结合其他条件就可以写出NHibernate能够理解查询。

32020

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

() default {}; // 将字段子属性映射到节点上,等价于jackson@JsonUnwrapped boolean unwrapped() default false...; // 指定序列化字段为null时使用默认,等价于jackson@JsonProperty.defaultValue() String defaultValue()...// 反序列化多态类型时,如果根据其他typeName等方式无法找到正确子类时,默认使用子类,等价于jackson@JsonTypeInfo.defaultImpl() Class<?...typeName() default ""; // 反序列化某个接口或抽象子类时指定根据哪个字段子类typeName相等来决定具体实现,等价于jackson@JsonTypeInfo.use...() = Id.CUSTOM + @JsonTypeInfo.property() String typeKey() default ""; // 反序列化某个接口或抽象子类时指定可以反序列化子类类型

2.1K30

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

内部处理逻辑,jackson不支持该特性,不影响功能 对于没有字符串属性设置为空串 Feature.InitStringFieldAsEmpty 关闭 - - jackson不支持该特性,但是可以通过...() default {}; // 将字段子属性映射到节点上,等价于jackson@JsonUnwrapped boolean unwrapped() default false...; // 指定序列化字段为null时使用默认,等价于jackson@JsonProperty.defaultValue() String defaultValue() default...() default ""; // 反序列化某个接口或抽象子类时指定根据哪个字段子类typeName相等来决定具体实现,等价于jackson@JsonTypeInfo.use...() = Id.CUSTOM + @JsonTypeInfo.property() String typeKey() default ""; // 反序列化某个接口或抽象子类时指定可以反序列化子类类型

4.7K10

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

本篇主要介绍一下最近遇到一个问题,在Java 继承情况下如何实现子类JSON序列化与反序列化。...@JsonTypeInfo注解加到定义上 为了解决上面的这种继承关系对象序列化出现问题,jackson为我们提供了JsonTypeInfo注解,把它加在定义上面即可。...@JsonTypeInfo注解加到包含成员变量上面 @JsonTypeInfo注解不仅可以加在定义上面,也可以加到包含成员变量上面。序列化和反序列化结果和上面内容是一样。...如果该注解同时作用在和属性上,则以使用在属性上注解为准,因为它被认为更具体。 需要特别说明是,当@JsonTypeInfo在属性(字段,方法)上使用时,此注解适用于。...原文地址:如何通过Jackson注解@JsonTypeInfo解决多态反序列化问题?

4.2K10

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

一、背景 工作中有时候会遇到一个定义了某个类型作为成员变量,实际存放为某个子类型, JSON 反序列化后,属性丢失情况。 如果你赶时间,可以直接跳到第三部分看解决方案。...Parent 具体类型,反序列化丢失了 other 成员变量。...三、解决办法 3.1 将子类型写入 JSON 字符串 先说一个常规做法。 如果我们在序列化时将具体子类型写入到 JSON 字符串中,反序列化时就可以使用该子类型对其进行反序列化。...即如果 Parent 有多个了子类型,如果下游需要根据不同子类型执行不同策略。 我们可以将Parent 子类型直接定义在 Some 中。...), child2=null) 执行 Child 子类对应策略 3.3 加入标记 如果我们不想将每个子类型都写入到 Some 中,我们还可以在 Some 中新增一个 String type 字段来标识具体是哪个子类

3.7K20

面向对象--序列化与反序列化

实现Serializable接口建议设置serialVersionUID字段,如果不设置,那么每次运行时,编译器会根据内部实现,包括名、接口名、方法名和属性等来自动生成serialVersionUID...因此实现Serializable接口最好是显示低设置serialVersionUID,修改时候可以根据需要或者兼容性来决定是否需要修改serialVersionUID。...使用Java原生态序列化需要注意,Java反序列化时候不会调用无参构造方法,而是调用native方法将成员变量赋值为对应类型初始,基于性能以及兼容性考虑,不推荐使用Java序列化。...所以在子类存在同名成员变量情况下,Hessian 序列化时,先序列化子类,然后序列化,因此反序列化结果会导致子类同名成员变量被覆盖。...Java工程中广泛使用Apache Commons Collections、Jackson、fastjson等都出现过反序列化漏洞。 如果防范这种黑客攻击呢?

1.4K20

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

若一直向入参中新增字段(不满足开闭原则)就会导致后期不可维护性。 方案一:Controller层接收是String类型,然后通过手动方式来进行反序列化子类对象。...可以通过下面几个注解来实现: 1.1 @JsonTypeInfo注解 作用在接口/上,被用来开启多态类型处理,对基/接口和子类/实现都有效。...visible(可选,默认为false):是否可见 属性定义了类型标识符是否会通过JSON流成为反序列化一部分,默认为fale,也就是说,jackson会从JSON内容中处理和删除类型标识符再传递给...是一个@JsonSubTypes.Type[]数组,里面枚举了多态类型(value对应子类)和类型标识符(name对应@JsonTypeInfo中property标识名称,此为可选。...智能版:扩展@JsonTypeIdResolver使用 Jackson 多态序列化可以通过@JsonSubtypes来实现,但总觉得不是很方便,比如新增子类时候都要去加一下JsonSubTypes

2K40

Jackson用法详解

无论访问字段,数组还是嵌套对象,都可以使用JsonNodeget()方法。 通过将字符串作为参数提供给get()方法,可以访问JsonNode字段。...6、转换JsonNode字段 Jackson JsonNode包含一组可以将字段转换为另一种数据类型方法。 例如,将String字段转换为long或相反。...要将Java字段标记为需要由Jackson注入其字段,请在该字段上方添加@JacksonInject注解。...如果要反序列化其他类型(例如java.util.Date),则必须在泛型括号内指定该类型。 可以通过调用jsonParser参数getText()方法来获取要反序列化字段。...2、@JsonGetter @JsonGetter Jackson注解用于告诉Jackson,应该通过调用getter方法而不是通过直接字段访问来获取某个字段

15K21

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

什么是Jackson Jackson是比较主流基于JavaJSON库,可用于Json和XML与JavaBean之间序列化和反序列化。...格式化统一配置 在使用ObjectMapper时,会存在一些字段在某些情况下不需要进行序列化或反序列化,同时还可能需要指定格式化一些信息等。此时,可以通过ObjectMapper进行配置。...注解使用 上面通过统一配置可对全局格式序列化和反序列化进行配置,但某些个别的场景下,需要针对具体字段进行配置,这就需要用注解。...@JsonProperty,作用JavaBean字段上,指定一个字段用于JSON映射,默认情况下映射JSON字段与注解字段名称相同。可通过value属性指定映射JSON字段名称。...反序列化时@JsonIgnoreProperties(ignoreUnknown=true)会忽略中不存在字段。 @JsonFormat作用于字段上,通常用来进行格式化操作。

3.3K31

Jaskson精讲第7篇-JsonTypeInfo注解在继承关系下使用

精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换》 本篇文章是系列文章第7篇,主要是为大家介绍一下,在Java 继承情况下如何实现子类JSON序列化与反序列化...三、@JsonTypeInfo注解加到定义上 为了解决上面的这种继承关系对象序列化出现问题,jackson为我们提供了JsonTypeInfo注解,把它加在定义上面即可。...@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) public class ClsShape { } 在定义上面加上@JsonTypeInfo注解之后,序列化与反序列化输出结果如下...=9)]) 值得注意是在序列化之后java字符串中,每个Json对象都包含了一个新属性@class,这也是该对象在继承关系下能够反序列化为正确java对象(@class对象)关键所在。...四、@JsonTypeInfo注解加到包含成员变量上面 @JsonTypeInfo注解不仅可以加在定义上面,也可以加到包含成员变量上面。

2.7K10

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

,但是你确切地知道应该使用实现类型(ps:也就说,我们需要反序列化后生成对象是实现类型) 当输出(序列化)时,Jackson默认使用是给定运行时类型;但是你可能不想输出那个类型所有信息,而仅仅是它类型所囊括信息...(typing=Typing.STATIC) public BasicType another; } 2 中级 ①使用构造器或工厂方法 在默认情况下,当由JSON数据创建相应实例时,Jackson...Jackson在反序列化时(读取JSON数据,生成相应对象)需要这些信息,以便能正确地读取对象类型。...我们可以通过在“基本类型”上添加@JsonTypeInfo注解来完成操作: //将Java名称(“com.myempl.ImplClass”)存储到JSON一个名称为“class”属性中 @JsonTypeInfo...(Changing property auto-detection) Jackson默认属性发现规则将会查找到如下所述属性: 所有被public修饰字段(成员变量); 所有被public修饰getter

1.4K61

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

1.2.4 字符串   字符串(string)是由双引号包围任意数量 Unicode 字符集合,使用斜线转义。...若为作用在 set/get 方法上,反序列化时不会赋值给属性 format 用在 Date 类型字段来格式化时间格式 serialize、deserialize 布尔类型, 在序列化时候就不包含这个字段了...serialzeFeatures fastjson 默认序列化规则是当字段为 null 时候,是不会序列化这个字段 1.3.2 Jackson   Jackson 是当前用比较广泛,用来序列化和反序列化...Jackson 内部实现正是通过高性能流模式 API JsonGenerator 和 JsonParser 来生成和解析 json。...value: 指你需要指定名字 @JsonFormat 实体/属性使用注解,在序列化或者反序列化时候,指定属性格式化日期/时间 1.3.3 一些对象 JSON 字符串格式 ☞ JavaBean

4.4K20

详解Jackson动态属性设置@JsonAnyGetter和@JsonAnySetter

通过在 User getDynamicProps() 方法上使用 @JsonAnyGetter 注解,我们告诉 Jackson序列化过程中将动态属性包含在 JSON 中。...这样可以很方便地将动态属性包含在序列化结果中,而无需预先定义每个属性字段。...类型 3) 方法不能有返回 2.2 @JsonAnySetter 注解使用 下面是一个示例代码,演示了如何使用 @JsonAnySetter 注解: import com.fasterxml.jackson.annotation.JsonAnySetter...通过在 User setDynamicProp() 方法上使用 @JsonAnySetter 注解,我们可以很方便地将动态属性设置到对象中。...这样即使 User 没有事先定义动态属性字段,也能正确地接收和处理动态属性。 术因分享而日新,每获新知,喜溢心扉。 诚邀关注公众号 『 码到三十五 』 ,获取更多技术资料。

9810

了解 dubbo 序列化,从 bug 开始

首先交代背景,前几天遇到一个小bug,由于其他系统一个DTO子类有一个字段名重复了,所以导致我set子类字段那边拿不到。...改起来很简单嘛,让对面把子类字段删掉就好,但是拿不到原因让我想了很久,很明显是序列化和反序列化过程中这个字段丢失了,但是到底是在哪一步呢?还是决定看看源码给自己一个答案。...我们看看他干了个什么事: 首先检查了有没有writeReplace方法 然后把所有声明字段放到数组中遍历,然后把除了transient和static修饰字段放到ArrayList中去 然后往上找执行相同操作...和序列化时相同,先取子类再取,本来以为到这就结束了,可是看到了一行校验: fieldMap.get(field.getName()) == null 如果字段名和子类字段名相同,会跳过该循环,...debug发现值被覆盖就是在这里操作: deser.deserialize(in, obj); ? 子类set过以后,过来也会拿到子类序列化器,把子类覆盖掉。

68530

穿越到东汉末年Jackson

ASM 可以直接产生二进制 class 文件,也可以在被加载入 Java 虚拟机之前动态改变行为。 ASM能够通过改造既有,直接生成需要代码。...null处理 有的需要输出null,希望保留字段。有的需要不输出,输出结果里头剔除空。...例如,ExtendableBean实体具有name属性和一组键/对形式可扩展属性: image.png 当我们序列化这个实体一个实例时,我们将Map中所有键值作为标准、普通属性: image.png...我们将使用 @JsonSerialize通过CustomDateSerializer序列化eventDate属性: image.png 这是简单自定义 Jackson 序列化程序: image.png...让我们通过一个简单例子来看看这个注解是如何工作: image.png 这里我们有一个 POJO,我们想将带有fName、f_name和firstName 等值JSON 反序列化到 POJOfirstName

1.9K20
领券