XML,Object,Json转换之浅析Xstream的使用
最后更新于:2022-04-01 09:32:26
[XML,Object,Json转换之浅析Xstream的使用](http://blog.csdn.net/fengyuzhengfan/article/details/39654025)
请尊重他人的劳动成果,转载请注明出处:[XML,Object,Json转换之浅析Xstream的使用 ](http://blog.csdn.net/fengyuzhengfan/article/details/39654025)
XStream的是一个简单的库,主要用于Java对象和XML之间的转换。但XStream也内置了对Json的支持。
## 1.Xstream的特点:
这里直接引用Xstream官方的叙述:
**灵活易用:**在更高的层次上提供了简单、灵活、易用的统一接口,用户无需了解项目的底层细节
**无需映射:**大多数对象都可以在无需映射的情况下进行序列化与反序列化的操作
**高速稳定:**设计时力求达到的最重要的指标是解析速度快、占用内存少,以使之能够适用于大的对象处理或是对信息吞吐量要求高的系统
**清晰易懂:**项目采用reflection机制得到无冗余信息的XML文件。所生成的XML文件较本地Java序列化产物更简洁,格式更清晰,更便于用户阅读
**无需修改:**完全序列化包括private和final类型在内的全部内部字段。支持非公有类和内部类,类可以没有缺省的构造函数
**易于集成**:通过实现特定的接口,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、 JDomDriver、StaxDriver等等。
前面提到了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):将对象转换成XML、Json。
*xStream*.toXML(obj, outputStream):将对象转换XML、Json并封装成输出流。
*xStream*.toXML(object, writer):将对象转换XML、Json并封成写入流。
*xStream*.fromXML():将XML、Json转换成对象,此方法接受File、InputStream、Reader、String、URL类型的参数。
*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);
}
~~~