我有一个 Animal
类接受泛型类型参数 T
,如下所示:
public class Animal<T> {
private String type;
private T details;
// getters and setters
}
类型参数可以是Dog
或Cat
。
public class Dog {
private String name;
private boolean goodBoy;
// no-arg, all-args constructors, getters and setters
}
public class Cat {
private String name;
private boolean naughty;
// no-arg, all-args constructors, getters and setters
}
我正在尝试反序列化以下 JSON
。
{
"type": "dog",
"details": {
"name": "Marley",
"goodBoy": true
}
}
但是,当我反序列化时,字段详细信息总是被反序列化为 LinkedHashMap
而不是类的特定实现。
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
Animal<Dog> dog = new Animal<>();
dog.setType("dog");
dog.setDetails(new Dog("Marley", true));
String dogJson = mapper.writeValueAsString(dog);
Animal dogDeserialized = mapper.readValue(dogJson, Animal.class);
// dogDeserialized's details is LinkedHashMap
}
我无法更改上述类,因此无法在该字段上使用注释。有没有一种方法可以指定 ObjectMapper
可以将 details
字段反序列化为的类列表?
请注意,对于相应的 Dog
或 Cat
类,type
字段的值设置为“dog”或“cat”。
最佳答案
使用TypeReference
指定要反序列化的类型
Animal<Dog> dogDeserialized = mapper.readValue(
dogJson, new TypeReference<Animal<Dog>>() {});
或者代替 Dog
和 Cat
你可以只有一个具有所有属性的类
public class AnimalDetails {
private String name;
private Boolean goodBoy;
private Boolean naughty;
}
并设置 ObjectMapper 以忽略 JSON 中的未知属性:
ObjectMapper mapper = new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
所以如果它是 Dog
class naughty
将是 null
如果它是 Cat
class goodBoy
将为 null
关于java - 不使用注释的 Jackson 多态反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57078055/