gpt4 book ai didi

json - 使用 JAXB 将通用 Java 类绑定(bind)到 JSON

转载 作者:行者123 更新时间:2023-12-03 07:04:19 25 4
gpt4 key购买 nike

我有以下java类

@XmlRootElement
@XmlSeeAlso(DataClass.class)
public static class EnvelopeClass<T> {

@XmlElement
public String version;

@XmlElement
public T data;

EnvelopeClass() {
}

EnvelopeClass(String version, T data) {
this.version = version;
this.data = data;
}

}

@XmlRootElement
public static class DataClass {

@XmlElement
public String name;

DataClass() {
}

DataClass(String name) {
this.name = name;
}

}

我正在创建它的实例并将其编码(marshal)至 json

EnvelopeClass<DataClass> dataClassEnvelopeClass = new EnvelopeClass<DataClass>("1.0", new DataClass("myName"));

我有下一个结果:

{"version":"1.0","data":{"@type":"dataClass","name":"myName"}}

我不想在 json "@type":"dataClass" 中包含类型类型信息,换句话说,我想要下一个结果:

{"version":"1.0","data":{"name":"myName"}}

当 EnvelopeClass 没有泛型时,我得到的正是这个结果。

有办法做到这一点吗?

最佳答案

要获得所需的行为,您可以在数据属性上使用 @XmlAnyElement 而不是 @XmlElement。对于 @XmlAnyElement 属性,该值将对应于具有匹配 @XmlRootElement 注释的类。

信封类

import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;

@XmlRootElement
@XmlSeeAlso(DataClass.class)
public class EnvelopeClass<T> {

@XmlElement
public String version;

@XmlAnyElement
public T data;

EnvelopeClass() {
}

EnvelopeClass(String version, T data) {
this.version = version;
this.data = data;
}

}

数据类

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="data")
public class DataClass {

@XmlElement
public String name;

DataClass() {
}

DataClass(String name) {
this.name = name;
}

}

演示

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(EnvelopeClass.class);

DataClass data = new DataClass("myName");
EnvelopeClass envelope = new EnvelopeClass<DataClass>("1.0", data);

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(envelope, System.out);
}
}

关于json - 使用 JAXB 将通用 Java 类绑定(bind)到 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3422545/

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