写这篇文章前先吐槽一下,公司突然想换支付渠道然而这个支付渠道一部分与银行对接还有一部分需要与第三方对接,银行对接就不吐槽了而跟第三方对接简直哔了狗,字段名没文档根本就看不懂各种英文首字母中文首字母缩写还不算,还他喵的同一个字段不同的接口取名不一样,-_-。
开始在正文
- 首先,xml与object转换需要的依赖:
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.10</version>
</dependency>
<dependency>
<groupId>xmlpull</groupId>
<artifactId>xmlpull</artifactId>
<version>1.1.3.1</version>
</dependency>
- 主要使用的方法:
- toXML(Object obj)方法:该方法主要是将对象转换成xml格式的字符串。
- fromXML(String xml)方法:该方法主要是将XML格式的字符串转换成Object对象。
- 可能使用到的注解:
@XStreamAlias("xml") //作用于类或字段,取别名
@XStreamImplicit //隐式集合
@XStreamImplicit(itemFieldName="part") //作用于集合字段
@XStreamConverter(SingleValueCalendarConverter.class) //作用于对象,注入转换器
@XStreamAsAttribute //作用于字段,转换成属性
@XStreamOmitField //作用于字段,忽略字段
注意:如果使用以上注解,则需要使用autodetectAnnotations(true); 将XStream对象的自动侦查注解设置为true。或使用processAnnotations(clazz);【class为需要转换的对象类.calss】,否则注解将会无效。
- 实例代码:
/**
* 将xml字符串转换成object对象
* @param xmlStr
* @return
* @author xu
*/
public static Object xmlToObject(String xmlStr, Class clazz) {
XStream xStream = new XStream();
/**
* 由于使用xStream.autodetectAnnotations(true);注解貌似无效,
* 导致转换时出现异常,因此使用xStream.processAnnotations(clazz);
* 来进行注解注入。
*/
xStream.processAnnotations(clazz);
return xStream.fromXML(xmlStr);
}
/**
* 将Object对象转换成XML字符串
* @param obj
* @return
* @author xu
*/
public static String objectToXML(Object obj) {
XStream xStream = new XStream();
/**
* 当不使用xStream.autodetectAnnotations(true);
* 或xStream.processAnnotations(clazz);时,输出结果如下:
* <com.test.Student>
* <sid>1</sid>
* <name>张三</name>
* <age>25</age>
* <sex>女</sex>
* </com.test.Student>
*/
xStream.autodetectAnnotations(true);
return xStream.toXML(obj);
}
/**
* 转换的对象类
*/
@XStreamAlias("STUDENT")
class Student {
/** id */
@XStreamAlias("SID")
private Long sid;
/** 学生姓名 */
@XStreamAlias("NAME")
private String name;
/** 学生年龄 */
@XStreamAlias("AGE")
private Integer age;
/** 学生性别 */
@XStreamAlias("SEX")
private String sex;
public Long getSid() {
return sid;
}
public void setSid(Long sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student() {
}
public Student(Long sid, String name, Integer age, String sex) {
this.sid = sid;
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
测试代码与输出:
/**
* 对象转XML测试方法
*/
@Test
public void objectToXMLTest() {
Student student = new Student(1L, "张三", 25, "女");
System.out.println(objectToXML(student));
}
//输出结果为:
//<STUDENT>
// <SID>1</SID>
// <NAME>张三</NAME>
// <AGE>25</AGE>
// <SEX>女</SEX>
//</STUDENT>
/**
* XML转对象测试方法
*/
@Test
public void xmlToObjectTest() {
StringBuilder sb = new StringBuilder("<STUDENT>")
.append("<SID>1</SID>")
.append("<NAME>张三</NAME>")
.append("<AGE>25</AGE>")
.append("<SEX>女</SEX>")
.append("</STUDENT>");
Student stu = (Student)xmlToObject(sb.toString(), Student.class);
System.out.println(stu.toString());
}
//输出结果为:
//Student{sid=1, name='张三', age=25, sex='女'}
以上为个人总结的一些笔记,若有雷同纯属巧合,若有错误欢迎指出,谢谢!