注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。
EclipseLink MOXy は、JAXB (JSR-222) 準拠の実装です。EclipseLink 2.4.0 では、JSON バインディングが導入されました。MOXy は JAXB 実装であるため、MOXy が生成する JSON 出力は、同じメタデータに基づく XML 出力と非常に一貫性があります。以下に例を挙げて説明します。
ドメインモデル
以下は、この回答に使用するドメイン モデルです。JAXB モデルで名前空間情報を指定する方法の詳細については、http: //blog.bdoughan.com/2010/08/jaxb-namespaces.htmlを参照してください。
パッケージ情報
@XmlSchema(
namespace="http://www.example.com/A",
elementFormDefault=XmlNsForm.QUALIFIED,
xmlns={
@XmlNs(prefix="a",namespaceURI = "http://www.example.com/A"),
@XmlNs(prefix="b",namespaceURI = "http://www.example.com/B")
}
)
package forum13214306;
import javax.xml.bind.annotation.*;
お客様
package forum13214306;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
String firstName;
@XmlElement(namespace="http://www.example.com/B")
String lastName;
}
XML 処理
以下は、ドメイン モデルが XML 表現にどのように対応するかの例です。
デモ
package forum13214306;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum13214306/input.xml");
Customer customer = (Customer) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
}
}
input.xml/出力
<?xml version="1.0" encoding="UTF-8"?>
<a:customer xmlns:b="http://www.example.com/B" xmlns:a="http://www.example.com/A">
<a:firstName>Jane</a:firstName>
<b:lastName>Doe</b:lastName>
</a:customer>
JSON 処理 - 名前空間なし
名前空間は JSON の概念ではないため、回避できる場合はシミュレートしないことをお勧めします。以下では、MOXy がそれらを必要としないことを示します。名前空間を持つ XML ドキュメントに使用されたのとまったく同じドメイン モデルJAXBContext
がここで使用されていることに注意してください。
jaxb.properties
MOXy を JSON プロバイダーとして指定するにはjaxb.properties
、次のエントリを使用して、ドメイン モデルと同じパッケージで呼び出されるファイルを含める必要があります (参照: http://blog.bdoughan.com/search/label/jaxb.properties )。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
デモ
JSON バインディングを有効にするには、 およびMEDIA_TYPE
でプロパティを有効にする必要がMarshaller
ありUnmarshaller
ます。
package forum13214306;
import java.io.File;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.MarshallerProperties;
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/json");
File json = new File("src/forum13214306/input.json");
Customer customer = (Customer) unmarshaller.unmarshal(json);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
marshaller.marshal(customer, System.out);
}
}
input.json/出力
以下は、デモ コードの実行に対する入力と出力です。JSON ドキュメントにシミュレートされた名前空間情報がないことに注意してください。
{
"customer" : {
"firstName" : "Jane",
"lastName" : "Doe"
}
}
JSON 処理 - シミュレートされた名前空間を使用
デモ
本当に JSON ドキュメントで名前空間をシミュレートしたい場合は、とのNAMESPACE_PREFIX_MAPPER
プロパティを利用してそれを行うことができます。Marshaller
Unmarshaller
package forum13214306;
import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.MarshallerProperties;
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Map<String, String> namespaceToPrefixMap = new HashMap<String, String>(2);
namespaceToPrefixMap.put("http://www.example.com/A", "a");
namespaceToPrefixMap.put("http://www.example.com/B", "b");
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/json");
unmarshaller.setProperty(UnmarshallerProperties.JSON_NAMESPACE_PREFIX_MAPPER, namespaceToPrefixMap);
File json = new File("src/forum13214306/input.json");
Customer customer = (Customer) unmarshaller.unmarshal(json);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
marshaller.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER, namespaceToPrefixMap);
marshaller.marshal(customer, System.out);
}
}
input.json/出力
{
"a.customer" : {
"a.firstName" : "Jane",
"b.lastName" : "Doe"
}
}
詳細については