我有几个 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/