从 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:xsixsi:type="xsd:string"&gt; 将附加在内容元素中。我不想在我的 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 信息?的主要内容,如果未能解决你的问题,请参考以下文章

新优特性之XML,JSon解析

即使在JAXB中从XmlAdapter返回null之后,也不会从XML中删除Tag

在 JAXB 编组时删除命名空间前缀

如何在使用 jaxb 进行编组时删除额外的转义字符

在 JaxB 编组没有 @XmlRootElement 注释的元素时删除 ns2 前缀

从 xsd 生成 c++ 类的 JAXB 等效项?