我有一个问题是让Moxy为继承对象列表生成"好"的XML和JSON.XML查找或JSON看起来都很好,但不是同时.这是模型:
public static abstract class Animal { private String name; protected Animal() { } protected Animal(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } @XmlRootElement public static class Tiger extends Animal { public Tiger() { } public Tiger(String name) { super(name); } } @XmlRootElement public static class Lion extends Animal { public Lion() { } public Lion(String name) { super(name); } } @XmlRootElement public static class Zoo { private Listanimals = new ArrayList<>(); @XmlElementRef public List getAnimals() { return animals; } public void setAnimals(List animals) { this.animals = animals; } public void addAnimal(Animal a) { animals.add(a); } }
从以下Zoo实例生成的XML和JSON
zoo = new Zoo(); zoo.addAnimal(new Tiger("Hobbes")); zoo.addAnimal(new Lion("Simba")); zoo.addAnimal(new Tiger("Sherikan"));
看起来像:
{ "zoo" : { "tiger" : [ { "name" : "Hobbes" }, { "name" : "Sherikan" } ], "lion" : [ { "name" : "Simba" } ] } } Hobbes Simba Sherikan
XML看起来也是我想要的,但JSON很奇怪.Moxy使用类型作为键的方式不会保留列表中元素之间的顺序.这是一个错误或功能吗?
如果我改变了注释Zoo.animals
,以@XmlElement
JSON的输出看起来不错,但XML输出已改变的东西,我不能使用.
{ "zoo" : { "animals" : [ { "type" : "tiger", "name" : "Hobbes" }, { "type" : "lion", "name" : "Simba" }, { "type" : "tiger", "name" : "Sherikan" } ] } }Hobbes Simba Sherikan
我想出解决这个问题的唯一方法是创建一个外部OXM绑定文件来覆盖注释Zoo.animals
.下面的绑定是使用JAXBContextProperties.OXM_METADATA_SOURCE的属性注册的.
有没有更好的解决方案,不使用外部绑定文件?