2

我使用 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实例时应将所有元素添加到 .

有没有办法像杰克逊一样为 JAX-B 指定对象类名称?如果没有办法,为什么?

4

1 回答 1

1

我相信您正在寻找@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;
    }

}

抽象类

当元数据被计算出来时,我们将使用@XmlSeeAlso注释来引发Class1和处理。Class2Java 没有提供一种机制来反射地访问一个类的子类。

import javax.xml.bind.annotation.XmlSeeAlso;

@XmlSeeAlso({Class1.class, Class2.class})
public class AbstractClass {

}

第一类

默认情况下,每个类都有一个为短类名派生的类指示符名称。

public class Class1 extends AbstractClass {

}

2 类

我们可以使用@XmlType注解来覆盖类指示符名称。

import javax.xml.bind.annotation.XmlType;

@XmlType(name="class-two")
public class Class2 extends AbstractClass {

}

演示代码

演示

下面我们将创建一个实例Root并设置 和 的实例,Class1Class2属性classes是超类型的AbstractClass

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);
    }

}

输出

xsi:type的实例的值Class1是从类名派生的,实例的值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>
于 2013-10-22T19:23:40.843 回答