簡體   English   中英

像Jackson一樣編組的JAXB多態類型對象

[英]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批注。 以下是如何使用它的示例:

Java模型

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注釋使Class1Class2得到處理。 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實例,並在超類AbstractClassclasses屬性上設置Class1Class2實例。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM