gpt4 book ai didi

java - 使用 Jackson ObjectMapper 将子类名称序列化为 JSON,而不是父类(super class)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:24 26 4
gpt4 key购买 nike

在以下将对象序列化为 JSON 的 Jackson/Java 代码中,我得到了这个:

{"animal":{"x":"x"}}

然而,我真正想要得到的是:

{"dog":{"x":"x"}}

我可以对 AnimalContainer 做些什么,以便获得对象的运行时类型(“dog”、“cat”),而不是“animal”)? (编辑:我知道 map 名称来自 getter 和 setter 方法名称。)我能想到的唯一方法是在 AnimalContainer 中具有每种类型的动物的属性,具有所有动物的 setter 和 setter/getter ,并强制一次只有一个被重视。但这违背了拥有 Animal 父类(super class)的目的,而且看起来是错误的。在我的真实代码中,我实际上有十几个子类,而不仅仅是“狗”和“猫”。有没有更好的方法来做到这一点(也许以某种方式使用注释)?我也需要反序列化的解决方案。

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 {}
}

最佳答案

根据 this announement , Jackson 1.5 实现了完整的多态类型处理,trunk 现在集成了该代码。

有两种简单的方法可以做到这一点:

  • 在父类(super class)型(此处为 Animal)中添加 @JsonTypeInfo 注释,或者
  • 通过调用 ObjectMapper.enableDefaultTyping() 配置对象映射器(但如果是这样,Animal 需要是抽象类型)

关于java - 使用 Jackson ObjectMapper 将子类名称序列化为 JSON,而不是父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1325074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com