如何使用 SubTypes 将 json 反序列化为对象?

Joh*_*ohn 1 java jackson

我需要根据类型将 JSON 反序列化为对象。我有以下 JSON:

{
   "type": "dog",
   "name": "dogName"
}
Run Code Online (Sandbox Code Playgroud)

我有以下课程:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Dog.class, name = "dog"),
        @JsonSubTypes.Type(value = Cat.class, name = "cat"),
})
public abstract class Animal {
    @JsonProperty("type")
    public String type;
    public String name;
}

public class Dog extends Animal {
   ...
}

public class Cat extends Animal {
   ...
}
Run Code Online (Sandbox Code Playgroud)

当我尝试反序列化时一切都很顺利:

public class StartPdfApp {
    public static void main(String[] args) throws IOException {
        ...
        ObjectMapper mapper = new ObjectMapper();
        Animal animal = mapper.readValue(json, Animal.class);
        System.out.println("TYPE: " + animal.type);        // always null
        System.out.println("DOG: " + (animal instanceof Dog));
        System.out.println("CAT: " + (animal instanceof Cat));
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我想获取字段值时,typenull 该如何解决它?

Ped*_*dro 5

您需要告诉 Jackson 将类型字段传递给反序列化器,否则它仅用于类型区分。visible这是通过注释中的属性完成的@JsonTypeInfo。另外,不确定您的情况是否绝对必要,但我指定类型信息以使用现有属性:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.EXISTING_PROPERTY,
    property = "type",
    visible = true)
@JsonSubTypes({
        @JsonSubTypes.Type(value = Dog.class, name = "dog"),
        @JsonSubTypes.Type(value = Cat.class, name = "cat"),
})
public abstract class Animal {
    @JsonProperty("type")
    public String type;
    public String name;
}
Run Code Online (Sandbox Code Playgroud)