我有一个Zoo
类型,它有一个List<Animal>
字段,它的元素是Animal
子类的对象。当我用Jackson将一个Zoo
对象序列化为XML时,我想为不同类型的元素生成不同的标记名。
例如:
abstract class Animal {}
@JacksonXmlRootElement(localName = "Dog")
class Dog extends Animal {}
@JacksonXmlRootElement(localName = "Cat")
class Cat extends Animal {}
@JacksonXmlRootElement(localName = "Zoo")
public class Zoo {
@JacksonXmlProperty
@JacksonXmlElementWrapper(useWrapping = false)
List<Animal> animals = new ArrayList<>();
}
序列化Zoo
示例。
public static void main(String[] args) throws JsonProcessingException {
Zoo zoo = new Zoo();
zoo.animals.add(new Dog());
zoo.animals.add(new Cat());
zoo.animals.add(new Dog());
String xml = new XmlMapper().writerWithDefaultPrettyPrinter()
.writeValueAsString(zoo);
System.out.println(xml);
}
我期望得到:
<Zoo>
<Dog/>
<Cat/>
<Dog/>
</Zoo>
实际输出:
<Zoo>
<animals/>
<animals/>
<animals/>
</Zoo>
1条答案
按热度按时间5ktev3wc1#
使用自定义的序列化程序可以获得预期的结果,但是您失去了使用
JsonTypeInfo
的所有优点,并且您还必须编写自定义的反序列化程序。无论如何,您可以定义三个简单的类,如下所示:然后,您必须编写自定义的
ZooSerializer
序列化程序,该程序将生成自定义的xml:这将产生预期的结果,但代价是失去了所有优点,因为自动序列化和反序列化可以通过
JsonTypeInfo
和JsonSubTypes
注解在两个类上获得: