从xml / json JAXB中删除xsi:type信息?

时间:2016-09-15 12:25:04

标签: java xml jaxb jackson xml-serialization

我正在使用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">将附加在内容元素中。我不想在我的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 个答案:

答案 0 :(得分:2)

在marshalling中传递java.lang.Object参数和JAXB注释的pojo并且没有其他生成的元信息是不可能的。因为对象是&#34;未知&#34;类型,它需要在编组过程中被检测和转换,元数据将始终由默认的编组器生成。从现在开始,您有三个选择:

  1. 白色你的定制编组或适配器(有很多 WEB中的例子)
  2. 使用String而不是Object(快速而干净 溶液)
  3. 如果你真的必须使用通用的东西,请使用 &#34;元件&#34; (https://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/annotation/XmlAnyElement.html