在以下将对象序列化为 JSON 的 Jackson/Java 代码中,我得到了这个:
{"animal":{"x":"x"}}
但是,我真正想要得到的是:
{"dog":{"x":"x"}}
我可以对 AnimalContainer 做些什么,以便获得对象的运行时类型(“狗”、“猫”),而不是“动物”)? (编辑: 我知道地图名称来自 getter- 和 setter- 方法名称。)我能想到的唯一方法是在 AnimalContainer 中拥有每种动物的属性,具有 setter 和 getter所有这些,并强制一次只评估一个。但这违背了拥有 Animal 超类的目的,而且似乎是错误的。在我的真实代码中,我实际上有十几个子类,而不仅仅是“狗”和“猫”。有没有更好的方法来做到这一点(也许以某种方式使用注释)?我也需要一个反序列化的解决方案。
public class Test
{
public static void main(String[] args) throws Exception
{
AnimalContainer animalContainer = new AnimalContainer();
animalContainer.setAnimal(new Dog());
StringWriter sw = new StringWriter(); // serialize
ObjectMapper mapper = new ObjectMapper();
MappingJsonFactory jsonFactory = new MappingJsonFactory();
JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(sw);
mapper.writeValue(jsonGenerator, animalContainer);
sw.close();
System.out.println(sw.getBuffer().toString());
}
public static class AnimalContainer
{
private Animal animal;
public Animal getAnimal() {return animal;}
public void setAnimal(Animal animal) {this.animal = animal;}
}
public abstract static class Animal
{
String x = "x";
public String getX() {return x;}
}
public static class Dog extends Animal {}
public static class Cat extends Animal {}
}