我正在使用 Moxy 2.5.1 将对象编组为 json。该对象扩展了一个泛型类。我不想要 type 元素输出,所以我尝试按照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}
我希望它像第一个一样编组,没有 type 元素。
我不需要解组,所以如果类型信息丢失也没关系。
如果我输出 XML,也会发生类似的事情;RecordAB 的根元素具有以下属性集:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ab"
任何人都知道如何防止类型元素被输出?