xStream框架可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,并且也支持json的转换;它们都完美支持JSON,但是对xml的支持还不是很好。一定程度上限制了对Java对象的描述,不能让xml完全体现到对Java对象的描述。这里将会介绍xStream对JSON、XML的完美支持。xStream不仅对XML的转换非常友好,而且提供annotation注解,可以在JavaBean中完成对xml节点、属性的描述。以及对JSON也支持,只需要提供相关的JSONDriver就可以完成转换。
以下通过一个案例来演示xStream框架怎么操作xml、json的
步骤一:添加jar,如下所示:
步骤二:新建Student实体类
package com.ljq.test;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Student implements Serializable {
private int id;
private String name;
private String email;
private String address;
private String birthday;
public Student() {
}
public Student(int id, String name, String email, String address,
String birthday) {
super();
this.id = id;
this.name = name;
this.email = email;
this.address = address;
this.birthday = birthday;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String toString() {
return this.name + "#" + this.id + "#" + this.address + "#"
+ this.birthday + "#" + this.email;
}
}
SingleValueCalendarConverter转换器
package com.ljq.test;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
/**
* 类型转换器,模拟对Calendar进行转换
*
* @author jiqinlin
*
*/
public class SingleValueCalendarConverter implements Converter {
public void marshal(Object source, HierarchicalStreamWriter writer,
MarshallingContext context) {
Calendar calendar = (Calendar) source;
writer.setValue(String.valueOf(calendar.getTime().getTime()));
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(new Date(Long.parseLong(reader.getValue())));
return calendar;
}
public boolean canConvert(Class type) {
return type.equals(GregorianCalendar.class);
}
}
使用注解进行设置
package com.ljq.test;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
/**
* 使用注解进行设置
*
* @author jiqinlin
*
*/
@SuppressWarnings("serial")
public class Classes implements Serializable {
/**
* 设置属性显示
*/
@XStreamAsAttribute
@XStreamAlias("名称")
private String name;
/**
* 忽略
*/
@XStreamOmitField
private int number;
@XStreamImplicit(itemFieldName = "Students")
private List<Student> students;
@SuppressWarnings("unused")
@XStreamConverter(SingleValueCalendarConverter.class)
private Calendar created = new GregorianCalendar();
public Classes() {
}
public Classes(String name, Student student, Calendar created) {
super();
this.name = name;
this.students = Arrays.asList(student);
this.created = created;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
public Calendar getCreated() {
return created;
}
public void setCreated(Calendar created) {
this.created = created;
};
}
步骤三:测试
上图为单元测试方法目录
package com.ljq.test;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StringReader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
import com.thoughtworks.xstream.io.json.JsonWriter;
/**
* 测试代码
*
* @author jiqinlin
*
*/
public class XStreamTest {
private XStream xstream=null;
private ObjectInputStream inStream=null;
private ObjectOutputStream outStream=null;
private Student student=null;
/**
* 初始化
*/
@Before
public void init(){
xstream=new XStream();
student=new Student();
student.setAddress("china");
student.setEmail("416501600@qq.com");
student.setId(1);
student.setName("ljq");
student.setBirthday("1988-04-04");
}
/**
* 释放资源
*/
@After
public void destroy() {
xstream = null;
student = null;
try {
if (inStream != null) {
inStream.close();
}
if(outStream!=null){
outStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* java对象转换为xml对象
*/
@Test
public void beanToXml(){
try {
info("java->xml");
// <com.ljq.test.Student>
// <id>1</id>
// <name>ljq</name>
// <email>416501600@qq.com</email>
// <address>china</address>
// <birthday>1988-04-04</birthday>
// </com.ljq.test.Student>
info(xstream.toXML(student));
info("重命名后的xml");
//包重命名
xstream.aliasPackage("com", "com.ljq.test"); //包名com.ljq.test记得写正确
//<com.Student>
// <id>1</id>
// <name>ljq</name>
// <email>416501600@qq.com</email>
// <address>china</address>
// <birthday>1988-04-04</birthday>
//</com.Student>
info(xstream.toXML(student));
//类重命名
xstream.alias("Student", Student.class);
//属性重命名
xstream.aliasField("birth", Student.class, "birthday");
//<Student>
// <id>1</id>
// <name>ljq</name>
// <email>416501600@qq.com</email>
// <address>china</address>
// <birth>1988-04-04</birth>
//</Student>
info(xstream.toXML(student));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* List集合对象转换成xml对象
*/
@Test
public void listToXml(){
try{
List<Student> students=new ArrayList<Student>();
students.add(new Student(1, "zhangsan1", "zhangsan1@126.com", "china", "1988-04-04"));
students.add(new Student(2, "zhangsan2", "zhangsan2@126.com", "china", "1988-04-04"));
//id引用
//xstream.setMode(XStream.ID_REFERENCES);
//类重命名
xstream.alias("Student", Student.class);
//根元素重命名
xstream.alias("beans", List.class);
//将id、name设置为父类(Student)的元素的属性
xstream.useAttributeFor(Student.class, "id");
xstream.useAttributeFor(Student.class, "name");
//<beans>
//<Student >void error(String string) {
System.err.println(string);
}
}
详情请看: tp://www.cnblogs.com/hoojo/archive/2011/04/22/2025197.html