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

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

请尊重他人的劳动成果,转载请注明出处:XML,Object,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", News.class);//修改元素名称
       xStream.useAttributeFor(News.class, "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);     
    }


 

XStream组件进行ObjectXML互转用法 1.所需求jar包: xstream-1.3.1.jar 2.如果仅进行OBJECTXML之间互转只需要这一个jar 包及XStream这一个类就可又了 用法说明: 1.OBJECTXML //第一步:准备好要进行XML转换OBJECT对象,并且类里的属性都要有get与Set方法; 如下: Address address1 = new Address("郑州市经三路", "450001"); Address address2 = new Address("西安市雁塔路", "710002"); List addList = new ArrayList(); addList.add(address1); addList.add(address2); Profile profile = new Profile("软件工程师", "13512129933", "备注说明"); Person person = new Person("熔岩", "27", profile, addList); //第二步:创建一个XStream对象 XStream xStream = new XStream(); //第三步:进行转换 String xml = xStream. toXML(person); System.out.println(xml); //输出如下: //你会发明输出的XML节点的类名是类的全路径名 //如果要解决这一问题就需要进行转换前的装配XStream为此提供一个配置类名的方法 alias(“nodeName”,”class”); 其中nodeName 即XML的节点名称 其中class 即要映射到XML节点上的类 如: xStream.alias("PERSON", Person.class); xStream.alias("PROFILE", Profile.class); xStream.alias("ADDRESS", Address.class); //配置完成输出结果 可以看出person类的name和age属性映射出的节点名称与属性名称相同,那么XStream也支持对类属性的映射配置方法 : aliasField(“节点名称”,”类名称”,”属性名”) 如下: xStream.aliasField("PROFILE", Person.class, "profile"); xStream.aliasField("ADDLIST", Person.class, "addlist"); xStream.aliasField("Add", Address.class, "add"); xStream.aliasField("Job", Profile.class, "job"); 注:如果没有特殊要求最好不要配置属性节点的映射,否则如果再将生成的XML转换成OBJECT时将会非常麻烦。 //如果我们想实现又下的需求。 //XStream 还提供了装配节点属性的方法, useAttributeFor(“类”, “属性名”); 如下: xStream.useAttributeFor(Person.class,”name”); xStream.useAttributeFor(Person.class,”age”); 2.XMLOBJECT XMLOBJECT 只要调用xStream.fromXML(xml)方法,但同样要进行相关属性及类的映射。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值