[英]JAXB polymorphic type object marshalling like Jackson
我使用Jackson在祖先類中使用注釋為多態對象創建JSON:
// Include Java class name ("com.myempl.ImplClass") as JSON property "class"
@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY, property="class")
使用此注釋,后代類將具有帶有對象的類名稱的class
屬性。 當Jackson將JSON對象轉換回正確的后代時,將使用該類名。
當將JAX-B與
@XmlSeeAlso({Class1, Class2, ... ClassN })
注解,你必須指定元素的所有子類,如果你想正確的解組,或者你應該添加到所有元素JAXBContext
,創建一個新的時JAXBContext
實例。
是否有一種方法像Jackson一樣將對象類名稱指定為JAX-B? 如果沒有辦法,為什么呢?
我相信您正在尋找@XmlType
批注。 以下是如何使用它的示例:
根
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Root {
private List<AbstractClass> classes = new ArrayList<AbstractClass>();
@XmlElement(name="class")
public List<AbstractClass> getClasses() {
return classes;
}
}
AbstactClass
當確定元數據時,我們將使用@XmlSeeAlso
注釋使Class1
和Class2
得到處理。 Java沒有提供一種機制來反射地訪問類的子類。
import javax.xml.bind.annotation.XmlSeeAlso;
@XmlSeeAlso({Class1.class, Class2.class})
public class AbstractClass {
}
1類
默認情況下,每個類都有一個為簡短類名派生的類指示符名稱。
public class Class1 extends AbstractClass {
}
等級2
我們可以使用@XmlType
批注來覆蓋類指示符名稱。
import javax.xml.bind.annotation.XmlType;
@XmlType(name="class-two")
public class Class2 extends AbstractClass {
}
演示
下面,我們將創建Root
實例,並在超類AbstractClass
的classes
屬性上設置Class1
和Class2
實例。
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Root root = new Root();
root.getClasses().add(new Class1());
root.getClasses().add(new Class2());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}
}
產量
Class1
實例的xsi:type
的值是從類名稱派生的,而Class2
實例的值則對應於我們在@XmlType
批注上設置的名稱。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<class xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="class1"/>
<class xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="class-two"/>
</root>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.