gpt4 book ai didi

java - Jackson 多态性 - 没有属性的抽象类

转载 作者:行者123 更新时间:2023-11-30 06:37:26 25 4
gpt4 key购买 nike

我有几个 Json 字符串,如下所示:

{"type1": {"name": "Arnold"}}
{"type2": {"id": "abcd", "job": "plumber"}}

我想要结束的是将 json 字符串转换为类 Type1 之一或Type2 取决于元素的根属性:

// Type0 abstract class
public abstract class Type0 {
}

// Type1 class.. convert to it if {"type1": {...}}
@JsonRootName(value = "type1")
public class Type1 extends Type0 {
@JsonProperty("name")
String name;
}

// Type2 class.. convert to it if {"type2": {...}}
@JsonRootName(value = "type2")
public class Type2 extends Type0 {
@JsonProperty("id")
String id;

@JsonProperty("job")
String job;
}

如何配置ObjectMapper jackson 这样我就可以实现反序列化?我想到了这样的逻辑,是否可行:

ObjectMapper mapper = new ObjectMapper();
result = mapper.readValue(jsonString, Type0.class);
//TODO: code for deciding whether result is Type1 or Type2 and casting to it

最佳答案

jackson 通过 WRAPPER_OBJECT 支持此类案例。像这样注释抽象类:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(name = "type1", value = Type1.class),
@JsonSubTypes.Type(name = "type2", value = Type2.class)})
abstract class Type0 {}

然后,当使用 readValue 解析 Type0.class 时,您将获得相应派生类的实例。您不需要在派生类上使用 @JsonRootName

关于java - Jackson 多态性 - 没有属性的抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44973073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com