首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从xml/ JAXB中删除xsi:类型信息?

从xml/ JAXB中删除xsi:类型信息?
EN

Stack Overflow用户
提问于 2016-09-15 12:25:03
回答 1查看 2.8K关注 0票数 8

我使用JAXB将域模型转换为XML和JSON表示。我有to要转换为XMl/JSON。它有一个content属性,可以是任何数据类型。

它的模式定义:

代码语言:javascript
运行
复制
<xs:element name="content" type="xs:anyType" />

因此,生成的java文件对于内容具有Object类型。

Student.java:

代码语言:javascript
运行
复制
 @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "content"
    })
    @XmlRootElement(name = "student")
    public class Student
        extends People
    {
        ................

        @XmlElement(required = true)
        protected Object content;

    }

我使用以下代码:

Marshall:

代码语言:javascript
运行
复制
    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:

代码语言:javascript
运行
复制
<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">将附加在content元素中。我不希望XML中有这种类型的信息。

类似地,对于JSON,它添加了类型信息:

JSON:

代码语言:javascript
运行
复制
        {
           "name" : "Jack n Jones",
           "content" : {
               "type" : "string",
               "value" : "Sid"
            }
         }

如何删除类型信息并根据运行时的类型生成XML/JSON。因此,无论是哪种类型的content,它都被转换为没有类型信息的类型

例如,如果内容是String,那么XML:

代码语言:javascript
运行
复制
 <student>

        <name>Jack n Jones</name>
        <content>Sid</content>

    </student>
EN

回答 1

Stack Overflow用户

发布于 2016-09-23 13:26:21

在和JAXB注释的pojo中传递一个java.lang.Object参数,并且在编组之后没有额外生成的元信息是不可能的。由于对象是“未知”类型,因此需要在编组过程中检测和转换它,元数据将始终由默认编组程序生成。从现在开始,您有三个选择:

  1. 使用白色的自定义封送程序或适配器(WEB中有很多示例)
  2. 使用字符串而不是对象(快速和干净的解决方案)
  3. 如果您确实必须使用一些通用的东西,请使用"Element“(https://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/annotation/XmlAnyElement.html)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39510972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档