Moxy 2.5.1 を使用してオブジェクトを json にマーシャリングしています。オブジェクトはジェネリック クラスを拡張します。タイプ要素の出力が必要ないので、http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.htmlの例に従ってみました。
@XmlTransient とマークされたクラスがジェネリックでない場合、この手順は機能しますが、ジェネリックである場合、型要素は常に出力されます。
これは確かに人為的な例です:
public class AB {
@XmlElement
String a = "A";
@XmlElement
String b = "B";
}
@XmlTransient
public class Value {
@XmlElement
@XmlPath(".")
AB value = new AB();
}
@XmlRootElement
public class Record extends Value {
@XmlElement
int id = 1;
}
次のコードを使用してレコードをマーシャリングします。
JAXBContext jaxbContext =
org.eclipse.persistence.jaxb.JAXBContextFactory
.createContext(
new Class[]{ Record.class, AB.class}, null);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
Record record = new Record();
marshaller.marshal(record, System.out);
次の出力を取得します。
{"a":"A","b":"B","id":1}
今、私が次のことを試してみると:
@XmlTransient
public class ValueGeneric<T> {
@XmlElement
@XmlPath(".")
T value;
}
@XmlRootElement
public class RecordAB extends ValueGeneric<AB> {
@XmlElement
int id = 1;
}
マーシャリング コード (基本的には上記と同じですが、RecordAB.class を登録します):
JAXBContext jaxbContext =
org.eclipse.persistence.jaxb.JAXBContextFactory
.createContext(
new Class[]{RecordAB.class, AB.class}, null);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
RecordAB recordAB = new RecordAB();
recordAB.value = new AB();
marshaller.marshal(recordAB, System.out);
次のようにマーシャリングします。
{"type":"ab","a":"A","b":"B","id":1}
タイプ要素なしで、最初のもののようにマーシャリングしたい。
アンマーシャリングする必要がないので、型情報が失われても問題ありません。
XML を出力すると、同様のことが起こります。RecordAB のルート要素には、次の属性セットがあります。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ab"
タイプ要素が出力されないようにする方法を知っている人はいますか?