注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。
MOXy@XmlInverseReference
は、 XML バインディングと JSON バインディングの両方で双方向の関係をサポートするために使用できる拡張機能を提供します。
ジャバモデル
お客様
Customer
オブジェクトのコレクションがありPhoneNumber
ます。
package forum12312395;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Customer {
private List<PhoneNumber> phoneNumbers;
@XmlElement(name="phone-number")
public List<PhoneNumber> getPhoneNumbers() {
return phoneNumbers;
}
public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
this.phoneNumbers = phoneNumbers;
}
}
電話番号
各PhoneNumber
オブジェクトは、オブジェクトへのバック ポインターを保持しCustomer
ます。このプロパティには、注釈が付けられてい@XmlInverseReference
ます。
package forum12312395;
import javax.xml.bind.annotation.XmlValue;
import org.eclipse.persistence.oxm.annotations.XmlInverseReference;
public class PhoneNumber {
private String value;
private Customer customer;
@XmlValue
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@XmlInverseReference(mappedBy="phoneNumbers")
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
}
jaxb.properties
MOXy を JAXB プロバイダーとして使用するにはjaxb.properties
、次のエントリを使用して、ドメイン モデルと同じパッケージで呼び出されるファイルを含める必要があります ( http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-asを参照)。 -your.html ):
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
入力
以下は、この例で非整列化するドキュメントです
入力.xml
<?xml version="1.0" encoding="UTF-8"?>
<customer>
<phone-number>555-WORK</phone-number>
<phone-number>555-HOME</phone-number>
</customer>
入力.json
{
"customer" : {
"phone-number" : ["555-HOME", "555-WORK"]
}
}
デモ
package forum12312395;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
import org.eclipse.persistence.oxm.MediaType;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
// JSON
Unmarshaller jsonUnmarshaller = jc.createUnmarshaller();
jsonUnmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
StreamSource json = new StreamSource("src/forum12312395/input.json");
Customer customerFromJSON = (Customer) jsonUnmarshaller.unmarshal(json);
for(PhoneNumber phoneNumber : customerFromJSON.getPhoneNumbers()) {
System.out.println(phoneNumber.getCustomer());
}
// XML
Unmarshaller xmlUnmarshaller = jc.createUnmarshaller();
StreamSource xml = new StreamSource("src/forum12312395/input.xml");
Customer customerFromXML = (Customer) xmlUnmarshaller.unmarshal(xml);
for(PhoneNumber phoneNumber : customerFromXML.getPhoneNumbers()) {
System.out.println(phoneNumber.getCustomer());
}
}
}
出力
以下は、デモ コードを実行した結果の出力です。ご覧のとおり、customer
プロパティはすべてのPhoneNumber
オブジェクトに設定されています。
forum12312395.Customer@3ef38fd1
forum12312395.Customer@3ef38fd1
forum12312395.Customer@320eef20
forum12312395.Customer@320eef20
詳細については