背景
Json转为类时,结构并不完全一致,是由几个子类继承父类而成,直接使用父类的Class没法直接将json转为对应的子类。
使用注解
public class Zoo {
public Animal animal;
}
static class Animal { // All animals have names, for our demo purposes...
public String name;
protected Animal() { }
}
static class Dog extends Animal {
public double barkVolume; // in decibels
public Dog() { }
}
static class Cat extends Animal {
boolean likesCream;
public int lives;
public Cat() { }
}
在父类上加上如下注解
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
然后将子类用@JsonSubTypes来注册
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
@JsonSubTypes({
@JsonSubTypes.Type(name="dog",value=Dog.class),
@JsonSubTypes.Type(name="cat",value=Cat.class),
})
class Animal { }
要注意的是所有注解都是在父类的,子类不需改动。
解析的时候用
objectMapper.readValue(json, Animal.class);
即可。
不使用注解
ObjectMapper mapper = new ObjectMapper();
mapper.registerSubtypes(Animal.class);
mapper.registerSubtypes(new NamedType(Dog.class,"dog"));
mapper.registerSubtypes(new NamedType(Cat.class,"cat"));
这里需要注意的是父类也需要用registerSubtypes注册,且依然需要加上@JsonTypeInfo的注解。