gpt4 book ai didi

java - 像 Jackson 一样的 JAXB 多态类型对象编码

转载 作者:行者123 更新时间:2023-11-30 11:27:09 27 4
gpt4 key购买 nike

我使用 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;
}

}

抽象类

我们将使用@XmlSeeAlso 注释来使Class1Class2 在计算出元数据时得到处理。 Java 不提供反射访问类的子类的机制。

import javax.xml.bind.annotation.XmlSeeAlso;

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

}

Class1

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

public class Class1 extends AbstractClass {

}

Class2

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

import javax.xml.bind.annotation.XmlType;

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

}

演示代码

演示

下面我们将创建一个 Root 的实例,并在 classes 属性上设置 Class1Class2 的实例这是父类(super class)型 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);
}

}

输出

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>

关于java - 像 Jackson 一样的 JAXB 多态类型对象编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19465666/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com