我有以下JSON结构:
{name:type, properties...}
例如:
{"bulli":"dog","barkVolume":10}
{"dogi":"dog", "barkVolume":7}
{"kitty":"cat", "likesCream":true, "lives":3}
{"milkey":"cat", "likesCream":false, "lives":9}
现在,我想把它反序列化成一个多态的dog/cat对象来扩展animal,我试过这样做,但是我知道我需要做的有点不同,因为这里我的type键不是常量:
public class Zoo {
public Animal animal;
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = As.PROPERTY,
property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "dog"),
@JsonSubTypes.Type(value = Cat.class, name = "cat")
})
public static class Animal {
public String name;
}
@JsonTypeName("dog")
public static class Dog extends Animal {
public double barkVolume;
}
@JsonTypeName("cat")
public static class Cat extends Animal {
boolean likesCream;
public int lives;
}
有办法做到吗?
2条答案
按热度按时间7rfyedvj1#
似乎不支持以多态方式反序列化您提供的JSON。自定义
JsonDeserializer
可以给予您所需的结果。此代码不能直接解决您的问题,但可以用于派生一些有用的内容:和反序列化类:
正如您所看到的,需要对节点树进行一些筛选,但存在一些问题:
但是如果你使用的JSON不是很好的格式,这些就是需要的技巧。作为参考,下面是我的测试方法:
qyzbxkaa2#
您可以操作
{"bulli":"dog","barkVolume":10}
json对象,获取一个可以反序列化为Animal
对象的{"barkVolume":10,"type":"dog","name":"bulli"}
新json对象。在这种情况下,您可以将json对象转换为ObjectNode
,然后在第一个json属性始终为 “name”的条件下对其进行如下修改:“type”,如示例中所示: