本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2021-02-11 01:58     阅读(458)     评论(0)     点赞(19)     收藏(3)


我正在使用JAXB将域模型转换为XML和JSON表示形式。我有Student 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">即将附加在content元素中。我不需要XML中的此类信息。

同样,对于JSON,它添加类型信息:

JSON:

        {
           "name" : "Jack n Jones",
           "content" : {
               "type" : "string",
               "value" : "Sid"
            }
         }

如何在运行时删除类型信息并根据其类型生成XML / JSON 所以不管content是什么类型,都将转换为没有类型信息的类型

例如,如果内容为StringXML:

 <student>

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

    </student>

解决方案


无法在编组后传递带有java.lang.Object参数且带有JAXB注释的pojo,并且在编组后不具有其他生成的元信息。由于对象是“未知”类型的,因此在编组过程中需要对其进行检测和转换,并且元数据将始终由默认编组器生成。从这一点开始,您有三个选择:

  1. 将您的自定义编组器或适配器变白(WEB中有很多示例)
  2. 使用字符串而不是对象(快速干净的解决方案)
  3. 如果您确实必须使用通用的东西,请使用“元素”(https://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/annotation/XmlAnyElement.html


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/92041/b036110ee02f6d638ada/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

19 0
收藏该文
已收藏

评论内容:(最多支持255个字符)