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

标签 java json jackson polymorphism deserialization

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

相关文章:

java - 反序列化期间重复的字段

java - 将 json 列表分组为日期并进一步分组为特定字段

Android JsonArray 和 JsonObject 反序列化

java - Jackson 无法识别的字段 "media:recent"

javascript - 比较独立于顺序的对象数组

Java/Jackson注释: Mapping either an array or object?

java - Swing 中的重叠问题

java - 字数统计异常

java - 如何在长按主页、后退或最近使用的应用程序按钮时打开我的 Android 应用程序?

Java 8 LocalDate jackson 格式