XStream是一个在我看来比较好的一个第三方包了。因为它在解析时支持注解、这样很是方便,并且xml跟json这两种格式的文件都能进行解析,XStream本属于java的一个第三方包,甚是好用,若是拿它在android开发环境,也是能正常解析,但有点美中不足,因为android开发环境时,XStream不太支持json转对象,只支持对象转json,其他xml与对象的互转都支持。这样的话双解析就有了那么一点瑕疵之处,不过话说回来,没多少需求的数据交互会用json跟xml切来切去的,当只是json转对象时,可以用Gson.jar或Jsonlib.jar或其他的json解析。XStream.jar能支持注解,又支持xml和json双解析就已经很好了。
首先来了解注解的基本使用方法:
注解
@XStreamAlias别名注解
作用目标: 类,字段
@XStreamImplicit 隐式集合
@XStreamImplicit(itemFieldName="part")
作用目标: 集合字段
@XStreamConverter(SingleValueCalendarConverter.class) 注入转换器
作用目标: 对象
@XStreamAsAttribute 转换成属性
作用目标: 字段
@XStreamOmitField 忽略字段
作用目标: 字段
Auto-detect Annotations 自动侦查注解
xstream.autodetectAnnotations(true);
看下面的例子:
Student.java实体类
@XStreamAlias("Student") public class Student implements Serializable{ private static final long serialVersionUID = 1L; @XStreamAlias("name") private String name; @XStreamAlias("sex") private String sex; public Student(){ } public Student(String name,String sex){ this.name = name; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return getClass().getSimpleName() + ":{"+"name:" + name +",sex:" + sex+"}"; } }
/** * xml转bean * @param xml * @param clazz * @return */ public static <T> T xmlToBean(String xml,Class<T>... clazz){ T t = null; XStream xStream = new XStream(new Dom4JDriver()){ //xml转对象需要用到dom4j.jar包 @Override protected MapperWrapper wrapMapper(MapperWrapper next) { return new MapperWrapper(next) { @Override public boolean shouldSerializeMember(Class definedIn,String fieldName) { if(definedIn == Object.class){ try{ return this.realClass(fieldName)!=null; }catch(Exception e){ return false; } } return super.shouldSerializeMember(definedIn,fieldName); } }; } }; xStream.setMode(XStream.NO_REFERENCES); xStream.processAnnotations(clazz); t = (T)xStream.fromXML(xml); return t; }
/** * json转bean * @param json * @param clazz * @return */ public static <T> T jsonToBean(String json,Class<T>... clazz){ T t = null; XStream xStream = new XStream(new JettisonMappedXmlDriver()){ //json转对象时需要用到jettison.jar包 @Override protected MapperWrapper wrapMapper(MapperWrapper next) { return new MapperWrapper(next) { @Override public boolean shouldSerializeMember(Class definedIn,fieldName); } }; } }; xStream.setMode(XStream.NO_REFERENCES); xStream.processAnnotations(clazz); t = (T)xStream.fromXML(json); return t; }
public static void main(String[] args) { String json = "{'Student':{'name':'张三','sex':'男'}}"; Student student1 = jsonToBean(json,Student.class); System.out.println(student1.toString()); String xml = "<?xml version='1.0' encoding='utf-8'?><Student><name>李四</name><sex>女</sex></Student>"; Student student2 = xmlToBean(xml,Student.class); System.out.println(student2.toString()); }
打印结果如下:
Student:{name:张三,sex:男} Student:{name:李四,sex:女}