如所承诺的,我将举一个如何使用注释对多态对象进行序列化/反序列化的示例,该示例基于
Animal您正在阅读的教程中的类。
首先,在您的
Animal类中使用子类的Json注释。
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;import com.fasterxml.jackson.annotation.JsonSubTypes;import com.fasterxml.jackson.annotation.JsonTypeInfo;@JsonIgnoreProperties(ignoreUnknown = true)@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)@JsonSubTypes({ @JsonSubTypes.Type(value = Dog.class, name = "Dog"), @JsonSubTypes.Type(value = Cat.class, name = "Cat") })public abstract class Animal { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; }}然后是您的子类
Dog和
Cat。
public class Dog extends Animal { private String breed; public Dog() { } public Dog(String name, String breed) { setName(name); setBreed(breed); } public String getBreed() { return breed; } public void setBreed(String breed) { this.breed = breed; }}public class Cat extends Animal { public String getFavoriteToy() { return favoriteToy; } public Cat() {} public Cat(String name, String favoriteToy) { setName(name); setFavoriteToy(favoriteToy); } public void setFavoriteToy(String favoriteToy) { this.favoriteToy = favoriteToy; } private String favoriteToy;}如您所见,
Catand并没有什么特别的
Dog,唯一了解它们的是
abstractclass
Animal,因此在反序列化时,您将定位到
Animal并且
ObjectMapper将返回实际实例,如以下测试所示:
public class Test { public static void main(String[] args) { ObjectMapper objectMapper = new ObjectMapper(); Animal myDog = new Dog("ruffus","english shepherd"); Animal myCat = new Cat("goya", "mice"); try { String dogJson = objectMapper.writevalueAsString(myDog); System.out.println(dogJson); Animal deserializedDog = objectMapper.readValue(dogJson, Animal.class); System.out.println("Deserialized dogJson Class: " + deserializedDog.getClass().getSimpleName()); String catJson = objectMapper.writevalueAsString(myCat); Animal deseriliazedCat = objectMapper.readValue(catJson, Animal.class); System.out.println("Deserialized catJson Class: " + deseriliazedCat.getClass().getSimpleName()); } catch (Exception e) { e.printStackTrace(); } }}运行
Test该类后的输出:
{"@type":"Dog","name":"ruffus","breed":"english shepherd"}Deserialized dogJson Class: Dog
{"@type":"Cat","name":"goya","favoriteToy":"mice"}Deserialized catJson Class: Cat
希望这可以帮助,
何塞·路易斯



