注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。
您可以利用 EclipseLink JAXB (MOXy) 中的 JSON 绑定和外部映射文档来支持您的用例。
外部映射文件 (oxml.xml)
您可以使用@XmlPath(".")
MOXy 中的扩展来展平对象模型的某些部分。指定路径"."
告诉 MOXy 将引用的对象包含在父节点中。
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum10699038">
<java-types>
<java-type name="Metadata">
<java-attributes>
<xml-element java-attribute="artistList" xml-path="."/>
</java-attributes>
</java-type>
<java-type name="Artist">
<java-attributes>
<xml-element java-attribute="ipiList" xml-path="."/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
jaxb.properties
要将 MOXy 指定为您的 JAXB 提供程序,您需要添加一个jaxb.properties
在与您的域模型相同的包中调用的文件,其中包含以下条目。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
演示
下面的代码从您的 XML 文档填充对象模型,然后编组为 JSON。它演示了如何利用外部映射文件并将 MOXy 置于 JSON 模式。
package forum10699038;
import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
// READ FROM XML
JAXBContext jcXML = JAXBContext.newInstance(Metadata.class);
File xml = new File("src/forum10699038/input.xml");
Unmarshaller unmarshaller = jcXML.createUnmarshaller();
Metadata metadata = (Metadata) unmarshaller.unmarshal(xml);
// WRITE TO JSON
Map<String, Object> properties = new HashMap<String, Object>(3);
properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum10699038/oxm.xml");
properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
JAXBContext jcJSON = JAXBContext.newInstance(new Class[] {Metadata.class}, properties);
Marshaller marshaller = jcJSON.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(metadata, System.out);
}
}
输出
{
"artist" : [ {
"id" : "4302e264-1cf0-4d1f-aca7-2a6f89e34b36",
"type" : "Group",
"score" : "100",
"name" : "Farming Incident",
"ipi" : [ "1001" ]
} ]
}
MOXy 和泽西岛
您可以在 JAXB-RS 环境(例如 Jersey)中轻松使用 MOXy 作为 JSON 提供程序:
其他文件
以下是我创建的文件版本,以确保一切正常。
输入.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#" xmlns:ext="http://musicbrainz.org/ns/ext#-2.0">
<artist-list offset="0" count="1">
<artist ext:score="100" type="Group"
id="4302e264-1cf0-4d1f-aca7-2a6f89e34b36">
<name>Farming Incident</name>
<ipi-list>
<ipi>1001</ipi>
</ipi-list>
</artist>
</artist-list>
</metadata>
元数据
package forum10699038;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Metadata {
@XmlElement(name="artist-list")
ArtistList artistList;
}
艺术家名单
package forum10699038;
import java.util.List;
public class ArtistList {
private List<Artist> artist;
}
艺术家
package forum10699038;
import javax.xml.bind.annotation.*;
@XmlType(propOrder={"name", "ipiList"})
public class Artist {
@XmlAttribute
private String id;
@XmlAttribute
private String type;
@XmlAttribute(namespace="http://musicbrainz.org/ns/ext#-2.0")
private String score;
@XmlElement(name="ipi-list")
private IPIList ipiList;
private String name;
}
IP列表
package forum10699038;
import java.util.List;
public class IPIList {
private List<String> ipi;
}
包信息
@XmlSchema(
namespace = "http://musicbrainz.org/ns/mmd-2.0#",
elementFormDefault = XmlNsForm.QUALIFIED,
xmlns={
@XmlNs(prefix="", namespaceURI = "http://musicbrainz.org/ns/mmd-2.0#")
}
)
@XmlAccessorType(XmlAccessType.FIELD)
package forum10699038;
import javax.xml.bind.annotation.*;