gpt4 book ai didi

xml - Moxy:对象列表 XML 和 JSON 不能同时看起来不错

转载 作者:数据小太阳 更新时间:2023-10-29 01:58:30 25 4
gpt4 key购买 nike

我在让 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 List<Animal> animals = new ArrayList<>();

@XmlElementRef
public List<Animal> getAnimals() {
return animals;
}
public void setAnimals(List<Animal> 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"));

看起来像:

  <?xml version="1.0" encoding="UTF-8"?>
<zoo>
<tiger>
<name>Hobbes</name>
</tiger>
<lion>
<name>Simba</name>
</lion>
<tiger>
<name>Sherikan</name>
</tiger>
</zoo>
{
"zoo" : {
"tiger" : [ {
"name" : "Hobbes"
}, {
"name" : "Sherikan"
} ],
"lion" : [ {
"name" : "Simba"
} ]
}
}

XML 看起来也正是我想要的,但 JSON 很奇怪。 Moxy 使用类型作为键的方式不会保留列表中元素之间的顺序。这是错误还是功能?

如果我将 Zoo.animals 上的注释更改为 @XmlElement,JSON 输出看起来没问题,但 XML 输出已更改为我无法使用的内容。

  {
"zoo" : {
"animals" : [ {
"type" : "tiger",
"name" : "Hobbes"
}, {
"type" : "lion",
"name" : "Simba"
}, {
"type" : "tiger",
"name" : "Sherikan"
} ]
}
}
<?xml version="1.0" encoding="UTF-8"?>
<zoo>
<animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="tiger">
<name>Hobbes</name>
</animals>
<animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="lion">
<name>Simba</name>
</animals>
<animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="tiger">
<name>Sherikan</name>
</animals>
</zoo>

我想出的解决这个问题的唯一方法是创建一个外部 OXM 绑定(bind)文件来覆盖 Zoo.animals 上的注释。下面的绑定(bind)是使用 JAXBContextProperties.OXM_METADATA_SOURCE 的属性注册的。

  <?xml version="1.0"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xml-accessor-type="PUBLIC_MEMBER" xml-accessor-order="ALPHABETICAL"
xml-mapping-metadata-complete="false"
package-name="com.example">
<java-types>
<java-type name="com.example.JAXBTest2$Zoo">
<java-attributes>
<xml-element java-attribute="animals"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>

有没有不使用外部绑定(bind)文件的更好解决方案?

最佳答案

注意:我是 EclipseLink JAXB (MOXy) JAXB (JSR-222) 的领导和成员专家组

The way that the Moxy uses the type as key does not preserve order among the elements in the list. Is this a bug or feature?

我们这样做是为了防止 key 重复。

The only way I've come up with to solve this is to create an external OXM binding file to override the annotation on Zoo.animals. The binding below is registered using the property of JAXBContextProperties.OXM_METADATA_SOURCE.

这就是我建议如何解决您的用例。

关于xml - Moxy:对象列表 XML 和 JSON 不能同时看起来不错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20569891/

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