Bootstrap

json 反序列化 父子类型_使用Jackson将JSON反序列化为多态类型 – 完...

正如所承诺的,我正在举例说明如何使用注释来序列化/反序列化多态对象,我在您正在阅读的教程中的Animal类中使用此示例.

首先,你的Animal类带有子类的Json Annotations.

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;

}

}

然后你的子类,狗和猫.

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;

}

正如您所看到的,Cat和Dog没有什么特别之处,唯一了解它们的是抽象类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”:“狗”,“名字”:“ruffus”,“品种”:“英国牧羊犬”}

反序列化的dogJson类:狗

{ “@type”: “猫”, “名”: “戈雅”, “favoriteToy”: “老鼠”}

反序列化的catJson类:Cat

希望这可以帮助,

何塞路易斯

;