1、测试对象
package domain; import java.util.Date; public class User { private String name; private int age; private Date birthday; private Car car; private List<Book> books; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public List<Book> getBooks() { return books; } public void setBooks(List<Book> books) { this.books = books; } @Override public String toString() { return "User [name=" + name + ",age=" + age + ",birthday=" + birthday + ",car=" + "Car [brand=" + car.getBrand() + ",price=" + car.getPrice() + ",factory=" + car.getFactory() + "]" + ",books=" + books + "]"; } }
package domain; public class Book { private String bookName; private double price; private String author; public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } @Override public String toString() { return "Book [bookName=" + bookName + ",price=" + price + ",author=" + author + "]"; } }
package domain; public class Car { private String brand; private double price; private String factory; public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getFactory() { return factory; } public void setFactory(String factory) { this.factory = factory; } @Override public String toString() { return "Car [brand=" + brand + ",factory=" + factory + "]"; } }
2、对象到xml的转换
package test; import java.util.ArrayList; public class TestBean2XML { //XStream 同时可以转换list和map public static void main(String[] args) { // map2XML(); //------Car对象-----// Car car = new Car(); car.setBrand("宝马"); car.setFactory("上汽"); car.setPrice(500000); //------Car对象-----// //------Book对象-----// Book book1 = new Book(); book1.setBookName("语文"); book1.setAuthor("张三"); book1.setPrice(40.6); Book book2 = new Book(); book2.setBookName("数学"); book2.setAuthor("李四"); book2.setPrice(23.5); Book book3 = new Book(); book3.setBookName("英语"); book3.setAuthor("王五"); book3.setPrice(34); //------Book对象-----// //------User对象-----// User user = new User(); user.setName("小红"); user.setAge(12); user.setBirthday(new Date()); user.setCar(car); List<Book> list = new ArrayList<Book>(); list.add(book1); list.add(book2); list.add(book3); user.setBooks(list); //------User对象-----// //测试根据bean生成xml XStream xStream = new XStream(); // xStream.alias("user",User.class); //将类重命名 xStream.aliasType("用户",User.class); xStream.alias("book",Book.class); xStream.alias("car",Car.class); /* */ //测试重命名属性 /* xStream.aliasField("姓名",User.class,"name"); xStream.aliasField("汽车价格",Car.class,"price"); xStream.aliasField("作者",Book.class,"author"); */ //测试将字段申明在 xml的属性节点上,而非文本节点上,并重命名 xStream.aliasAttribute(User.class,"name","姓名"); xStream.aliasAttribute(Car.class,"price","汽车价格"); xStream.aliasAttribute(Book.class,"author","作者"); String xml = xStream.toXML(user); // System.out.println(xml); } //将map转换为xml public static void map2XML(){ Map<String,Book> map = new HashMap<String,Book>(); Book bean1 = new Book(); bean1.setBookName("语文"); bean1.setPrice(234); bean1.setAuthor("张三"); Book bean2 = new Book(); bean2.setBookName("语文"); bean2.setPrice(123); bean2.setAuthor("李四"); map.put("No.1",bean1);//put map.put("No.3",bean2);//put XStream xStream = new XStream(); xStream.alias("book",Book.class); xStream.alias("key",String.class); xStream.useAttributeFor(Book.class,"bookName"); String xml = xStream.toXML(map); System.out.println(xml); } }
3、xml到对象的转换
package test; import java.text.ParseException; public class TestXML2Bean { static String xml = "<user name = \"小红\">"+ "<age>12</age>"+ "<birthday>2015-07-14 14:33:42.567 UTC</birthday>"+ "<car>"+ "<brand>宝马</brand>"+ "<price>500000.0</price>"+ "<factory>上汽</factory>"+ "</car>"+ "<books>"+ "<book>"+ "<bookName>语文</bookName>"+ "<price>40.6</price>"+ "<author>张三</author>"+ "</book>"+ "<book>"+ "<bookName>数学</bookName>"+ "<price>23.5</price>"+ "<author>李四</author>"+ "</book>"+ "<book>"+ "<bookName>英语</bookName>"+ "<price>34.0</price>"+ "<author>王五</author>"+ "</book>"+ "</books>"+ "</user>"; public static void main(String[] args) { //这里一定要是用 DomDriver才能fromXML XStream xStream = new XStream(new DomDriver()); xStream.alias("user",Car.class); xStream.registerConverter( new DateConverter()); //如果是属性节点要同步设置xStream xStream.aliasAttribute(User.class,"name"); User user = (User)xStream.fromXML(xml); System.out.println(user.toString()); } } class DateConverter implements Converter { @Override public boolean canConvert(Class arg0) { return Date.class == arg0; } @Override public void marshal(Object arg0,HierarchicalStreamWriter arg1,MarshallingContext arg2) { } @Override public Object unmarshal(HierarchicalStreamReader reader,UnmarshallingContext arg1) { GregorianCalendar calendar = new GregorianCalendar(); SimpleDateFormat dateFm = new SimpleDateFormat("yyyy-MM-dd"); //格式化当前系统日期 try { calendar.setTime(dateFm.parse(reader.getValue())); } catch (ParseException e) { throw new ConversionException(e.getMessage(),e); } return calendar.getTime(); } }
4、对象到json的转换
package test; import java.io.Writer; public class TestBean2JSON { public static void main(String[] args) { Car car = new Car(); car.setBrand("宝马"); car.setFactory("上汽"); car.setPrice(500000); // ------Car对象-----// // ------Book对象-----// Book book1 = new Book(); book1.setBookName("语文"); book1.setAuthor("张三"); book1.setPrice(40.6); Book book2 = new Book(); book2.setBookName("数学"); book2.setAuthor("李四"); book2.setPrice(23.5); Book book3 = new Book(); book3.setBookName("英语"); book3.setAuthor("王五"); book3.setPrice(34); // ------Book对象-----// // ------User对象-----// User user = new User(); user.setName("小红"); user.setAge(12); user.setBirthday(new Date()); user.setCar(car); List<Book> list = new ArrayList<Book>(); list.add(book1); list.add(book2); list.add(book3); user.setBooks(list); //使用JettisonMappedXmlDriver驱动转换 /* XStream xstream = new XStream(new JettisonMappedXmlDriver()); xstream.setMode(XStream.NO_REFERENCES); */ //使用JsonHierarchicalStreamDriver驱动转换 // 删除根节点 XStream xstream = new XStream(new JsonHierarchicalStreamDriver() { public HierarchicalStreamWriter createWriter(Writer out) { return new JsonWriter(out,JsonWriter.DROP_ROOT_MODE); } }); xstream.alias("user",User.class); xstream.alias("book",Book.class); xstream.alias("car",Car.class); String xml = xstream.toXML(user); System.out.println(xml); } }
5、json到对象的转换
package test; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver; import domain.Book; import domain.Car; import domain.User; public class TestJSON2Bean { static String json = "{\"user\": {"+ "\"name\": \"小红\","+ "\"age\": 12,"+ "\"birthday\": \"2015-07-15 13:51:18.907 UTC\","+ "\"car\": {"+ "\"brand\": \"宝马\","+ "\"price\": 500000.0,"+ "\"factory\": \"上汽\""+ "},"+ "\"books\": ["+ "{"+ "\"bookName\": \"语文\","+ "\"price\": 40.6,"+ "\"author\": \"张三\""+ "},"+ "{"+ "\"bookName\": \"数学\","+ "\"price\": 23.5,"+ "\"author\": \"李四\""+ "},"+ "{"+ "\"bookName\": \"英语\","+ "\"price\": 34.0,"+ "\"author\": \"王五\""+ "}"+ "]"+ "}}"; static String json1 = "{\"books\": ["+ "{"+ "\"bookName\": \"语文\","+ "\"price\": 40.6,"+ "\"author\": \"张三\""+ "},"+ "{"+ "\"bookName\": \"数学\","+ "\"price\": 23.5,"+ "\"author\": \"李四\""+ "},"+ "{"+ "\"bookName\": \"英语\","+ "\"price\": 34.0,"+ "\"author\": \"王五\""+ "}"+ "]}"; public static void main(String[] args) { System.out.println(json); XStream xstream = new XStream(new JettisonMappedXmlDriver()); xstream.alias("user",Book.class); xstream.alias("car",Car.class); User user = (User)xstream.fromXML(json); //最后失败,貌似不能转 集合 System.out.println(user.toString()); } }