加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML,Object,Json转换之浅析Xstream的使用

发布时间:2020-12-16 05:50:56 所属栏目:百科 来源:网络整理
导读:XML,Object,Json 转换之浅析 Xstream 的使用 请尊重他人的劳动成果,转载请注明出处: XML,Json转换之浅析Xstream的使用 XStream 的是一个简单的库,主要用于 Java 对象和 XML 之间的转换。但 XStream 也内置了对 Json 的支持。 1.Xstream 的特点: 这里直接

XML,Object,Json转换之浅析Xstream的使用

请尊重他人的劳动成果,转载请注明出处:XML,Json转换之浅析Xstream的使用

XStream的是一个简单的库,主要用于Java对象和XML之间的转换。但XStream也内置了对Json的支持。

1.Xstream的特点:

这里直接引用Xstream官方的叙述:

灵活易用:在更高的层次上提供了简单、灵活、易用的统一接口,用户无需了解项目的底层细节

无需映射:大多数对象都可以在无需映射的情况下进行序列化与反序列化的操作

高速稳定:设计时力求达到的最重要的指标是解析速度快、占用内存少,以使之能够适用于大的对象处理或是对信息吞吐量要求高的系统

清晰易懂:项目采用reflection机制得到无冗余信息的XML文件。所生成 XML文件较本地Java序列化产物更简洁,格式更清晰,更便于用户阅读

无需修改:完全序列化包括privatefinal类型在内的全部内部字段。支 持非公有类和内部类,类可以没有缺省的构造函数

易于集成通过实现特定的接口,XStream可以直接与其它任何树型结构进行序列化与反序 列化操作(而不仅仅是XML格式)

灵活转换:转换策略是可以定制的,允许用户自定义特殊类型的对象如何以XML格式存储。

错误处理:由于XML资料不合法而造成异常时,会提供详细地诊断信息帮助处理问题。

2.初始化XStream

Xstream简单是因为它提供统一入口,主要类XStream用作所有项目的入口点。它将重要组件集成在一起,提供更简单易用的API操作。

我们可以使用以下的语句进行初始化操作:

XStreamxstream = new XStream();

默认情况下,XStream 采用Xpp3库,XPP3是一种运行效率非常高的XML全解析实现。如果你不想依靠Xpp3库的话,也可以使用一个标准的JAXP DOM解析器,可以采用以下语句进行初始化:

//不使用XPP3

XStreamxstream = new XStream(new DomDriver());

xstream实例,为线程安全的,可以供多个线程进行调用,共享使用。参考 com.thoughtworks.xstream.io.xml包,会发现系统提供了多种标识解析器供我们选择,包括,DomDriver JDomDriverStaxDriver等等。


前面提到了Xstream提供了对Json的支持,是因为Xstream内置了两个Driver

1.JsonHierarchicalStreamDriver:不依赖其他类库,只实现 obj->JSON

2.JettisonMappedXmlDriver:依赖jettison类库,实现 JSON->obj or obj->JSON

两种Driver在处理相同设置的Object时会得到不同的JSON串,JsonHierarchicalStreamDriver得到的串更简洁,确如官网所说。

JsonHierarchicalStreamDriver有个小问题——默认输出带格式的JSON串,结构中带空格、换行,并且没有提供修饰方式。

3.常用方法:

xStream.toXML(object)将对象转换成XMLJson

xStream.toXML(obj,outputStream):将对象转换XMLJson并封装成输出流。

xStream.toXML(object,writer): 将对象转换XMLJson并封成写入流。

xStream.fromXML()XMLJson转换成对象,此方法接受FileInputStreamReaderStringURL类型的参数。

xStream.alias("news",News.class)为指定类名创建别名。

xStream.useAttributeFor(News.class,"id"):将id设为 News的元素的属性。

xStream.aliasField("other",BookShelf.class,"remark"):修改节点名称,BookShelf类中的remark节点名修改为other

xStream.addImplicitCollection(BookShelf.class,"books")去掉集体节点的父节点。

xStream.aliasAttribute("姓名","name")修改属性的name,为姓名。

4.实例1:将对象转换成XML

 /**
     * 将对象转换成Xml格式的字符串
     * @param object 要转换成Xml的对象
     * @return String:Xml格式的字符串
     */
    public static String convertObject2Xml(Object object) {
       xStream=new XStream();
       xStream.alias("news",News.class);//修改元素名称
       xStream.useAttributeFor(News.class,"id");//将id设为News的元素的属性
       return xStream.toXML(object);     
    }

5.实例2:将XML象转换成对象

/**
     * 将成Xml格式的字符串转换成Java对象
     * @param inputStream 要转换成Java对象的inputStream
     * @return String:Xml格式的字符串
     */
    public static Object convertXml2Object(InputStream inputStream) {
       xStream=new XStream();
       xStream.alias("news","id");//将id设为News的元素的属性
       return  xStream.fromXML(inputStream);//此方法也可将xml转换成map
    }


6.实例3:将对象转换成Json

/**
     * 将对象转换成Json格式的字符串
     * @param object 要转换成Json的对象
     * @return String:Json格式的字符串
     */
    public static String convertObject2Json(Object object) {      
           xStream = new XStream(newJsonHierarchicalStreamDriver() {
            publicHierarchicalStreamWriter createWriter(Writer out) {
                //删除根节点
               return new JsonWriter(out,JsonWriter.DROP_ROOT_MODE);
            }
       });   
       return xStream.toXML(object);     
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读