从 xml/json JAXB 中删除 xsi:type 信息?
Posted
技术标签:
【中文标题】从 xml/json JAXB 中删除 xsi:type 信息?【英文标题】:Remove xsi:type information from xml/json JAXB? 【发布时间】:2017-01-23 11:19:25 【问题描述】:我正在使用 JAXB 将我的域模型转换为 XML 和 JSON 表示。
我有学生 pojo 可以转换为 XMl/JSON。它有一个content
属性,可以是任何数据类型。
它的架构定义:
<xs:element name="content" type="xs:anyType" />
因此生成的 java 文件的内容类型为 Object
。
Student.java:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder =
"content"
)
@XmlRootElement(name = "student")
public class Student
extends People
................
@XmlElement(required = true)
protected Object content;
我使用以下代码编组:
马歇尔:
Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "name-binding.xml");
this.ctx = JAXBContext.newInstance("packagename",
packagename.ObjectFactory.class.getClassLoader(), properties);
Marshaller marshaller = ctx.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE,media-type);
marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT,true);
marshaller.setProperty(MarshallerProperties.JSON_REDUCE_ANY_ARRAYS, true);
StringWriter sw = new StringWriter();
marshaller.marshal(object, sw);
XML:
<student>
<name>Jack n Jones</name>
<content xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">Sid</content>
</student>
xmlns:xsi
和 xsi:type="xsd:string">
将附加在内容元素中。我不想在我的 XML 中使用这种类型信息。
类似地,对于 JSON,它会添加类型信息:
JSON:
"name" : "Jack n Jones",
"content" :
"type" : "string",
"value" : "Sid"
如何在运行时删除类型信息并根据其类型生成 XML/JSON。所以无论content
是什么类型,它都会被转换为没有类型信息的类型
例如,如果内容是String
,那么 XML:
<student>
<name>Jack n Jones</name>
<content>Sid</content>
</student>
【问题讨论】:
【参考方案1】:传递一个 java.lang.Object 参数和 JAXB 注释的 pojo 并且在编组后没有额外生成的元信息是不可能的。由于Object是“unknown”类型,在编组过程中需要对其进行检测和转换,并且元数据将始终由默认编组器生成。从现在开始,您有三个选择:
-
白色您的自定义编组器或适配器(有很多
WEB中的例子)
使用字符串而不是对象(快速且干净
解决方案)
如果你真的必须使用通用的东西,使用
“元素”(https://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/annotation/XmlAnyElement.html)
【讨论】:
以上是关于从 xml/json JAXB 中删除 xsi:type 信息?的主要内容,如果未能解决你的问题,请参考以下文章
即使在JAXB中从XmlAdapter返回null之后,也不会从XML中删除Tag