注: 私は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" ]
} ]
}
モクシーとジャージー
Jersey などの JAXB-RS 環境で 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.*;