我需要根据类型将 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)
但是当我想获取字段值时,type我null
该如何解决它?
您需要告诉 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)
| 归档时间: |
|
| 查看次数: |
1631 次 |
| 最近记录: |