xStream框架可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,并且也支持json的转换;它们都完美支持JSON,但是对xml的支持还不是很好。一定程度上限制了对Java对象的描述,不能让xml完全体现到对Java对象的描述。这里将会介绍xStream对JSON、XML的完美支持。xStream不仅对XML的转换非常友好,而且提供annotation注解,可以在JavaBean中完成对xml节点、属性的描述。以及对JSON也支持,只需要提供相关的JSONDriver就可以完成转换。

          

以下通过一个案例来演示xStream框架怎么操作xml、json的

步骤一:添加jar,如下所示:

xStream框架操作XML、JSON

步骤二:新建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;
};

}

  

步骤三:测试

xStream框架操作XML、JSON

上图为单元测试方法目录

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

相关文章: