我有一些jaxb对象建模元数据结构,容器对象具有值,可以是另一个容器对象或只是一个简单的对象(例如字符串)。
@XmlRootElement(name = "value")
public class Value
{
protected SimpleType type;
protected Container container;
@XmlElement
public SimpleType getType()
{
return type;
}
public void setType(SimpleType type)
{
this.type = type;
}
@XmlInverseReference(mappedBy="value")
@XmlElement
public Container getContainer()
{
return container;
}
public void setContainer(Container container)
{
this.container = container;
}
}
@XmlRootElement(name = "container")
public class Container
{
protected Value value;
@XmlElement
public Value getValue()
{
return value;
}
public void setValue(Value value)
{
this.value = value;
}
}
@XmlRootElement(name = "type")
@XmlEnum
public enum SimpleType
{
@XmlEnumValue("String")STRING,
@XmlEnumValue("Boolean")BOOLEAN,
....etc.
}
XML似乎很好,但JSON最终会有重复的“容器”属性。
<container>
<value>
<container>
<value>
<type>String</type>
</value>
</container>
</value>
</container>
"container": {
"value": {
"container": {
"container": {
"value": {
"type": "STRING"
}
}
}
}
}
知道为什么会出现这种差异吗?
答案 0 :(得分:0)
这是因为Value
和Container
答案 1 :(得分:0)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。
由于您的模型中有MOXy的@XmlInverseReference
注释,因此您可能会对JSON案例中的这种注释感兴趣。
<强> input.xml中强>
从我的问题可以看出,如果Container
和Value
之间存在双向关系,则XML表示应如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<container>
<value>
<type>String</type>
</value>
</container>
域名模型
以下是您的域模型的映射方式。我已指定@XmlAccessorType(XmlAccessType.FIELD)
并删除了访问器方法以缩短示例。
的容器强> 的
package forum10706457;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "container")
@XmlAccessorType(XmlAccessType.FIELD)
public class Container
{
protected Value value;
}
的值强> 的
package forum10706457;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlInverseReference;
@XmlAccessorType(XmlAccessType.FIELD)
public class Value
{
protected SimpleType type;
@XmlInverseReference(mappedBy="value")
protected Container container;
}
<强> SimpleType的强>
package forum10706457;
import javax.xml.bind.annotation.*;
@XmlEnum
public enum SimpleType
{
@XmlEnumValue("String")STRING,
@XmlEnumValue("Boolean")BOOLEAN,
}
的 jaxb.properties 强>
@XmlInverseReference
注释是一个MOXy扩展,因此您需要在与域模型相同的包中添加名为jaxb.properties的文件,并使用以下条目将MOXy指定为JAXB提供者。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
<强>演示强>
下面的代码演示了如何加载XML文档,然后将生成的对象封送到JSON。检查是否填充了双向关系。
package forum10706457;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Container.class);
File xml = new File("src/forum10706457/input.xml");
Unmarshaller unmarshaller = jc.createUnmarshaller();
Container container = (Container) unmarshaller.unmarshal(xml);
System.out.println(container == container.value.container);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty("eclipselink.media-type", "application/json");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(container, System.out);
}
}
<强>输出强>
以下是运行演示代码的输出。请注意如何在JSON表示中使用@XmlEnumValue("String")STRING
。
true
{
"container" : {
"value" : {
"type" : "String"
}
}
}
了解更多信息