首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

对照XStream和JSON

2012-09-17 
对比XStream和JSONXStream是thoughtworks开发的开源产品,采用的是xpp来进行xml和对象之间的转换。它不需要s

对比XStream和JSON

XStream是thoughtworks开发的开源产品,采用的是xpp来进行xml和对象之间的转换。它不需要schema或其他的mapping文件就可以进行java对象和xml文件之间的转换,API调用起来非常方便,并且扩展功能强大。 ?
  JSON是目前比较流行的轻量级的对象数据转换方式,常常用在ajax和web service领域。目前大部分语言都有JSON的实现。Java领域有json lib,还有xstream json(jettison)。?
  主要是对3者 (xstream, json lib, xstream json) 转换的数据长度,还有转换的效率做个比较。?
  转换的java类为:?
  

package com.ldd600.ws; public class Employee {   private String name;   private int age;   private Address address;   private double salary;   private boolean isActive;   private char sexy;   public String getName() {     return name;   }   public void setName(String naem) {     this.name = naem;   }   public int getAge() {     return age;   }   public void setAge(int age) {     this.age = age;   }   public Address getAddress() {     return address;   }   public void setAddress(Address address) {     this.address = address;   }   public double getSalary() {     return salary;   }   public void setSalary(double salary) {     this.salary = salary;   }   public boolean isActive() {     return isActive;   }   public void setActive(boolean isActive) {     this.isActive = isActive;   }   public char getSexy() {     return sexy;   }   public void setSexy(char sexy) {     this.sexy = sexy;   } } 

?

 package com.ldd600.ws; public class Address {   private String street;   private String country;   private String city;   private String doorNum; //  private Employee employee;   private String empName;   public String getStreet() {     return street;   }   public void setStreet(String street) {     this.street = street;   }   public String getCountry() {     return country;   }   public void setCountry(String country) {     this.country = country;   }   public String getCity() {     return city;   }   public void setCity(String city) {     this.city = city;   }   public String getDoorNum() {     return doorNum;   }   public void setDoorNum(String doorNum) {     this.doorNum = doorNum;   }   public String getEmpName() {     return empName;   }   public void setEmpName(String empName) {     this.empName = empName;   } //  public Employee getEmployee() { //    return employee; //  } // //  public void setEmployee(Employee employee) { //    this.employee = employee; //  } } 

?
  数据格式和长度比较:?
方法 长度 格式?
Xstream 328

<com.ldd600.ws.Employee> <name>gavin</name>  <age>0</age>  <address>   <street>zhaojiabang</street>   <country>china</country>   <city>shanghai</city>   <doorNum>789</doorNum>   <empName>gavin</empName>  </address>  <salary>300000.0</salary>  <isActive>true</isActive>  <sexy>m</sexy> </com.ldd600.ws.Employee> 

?

Json lib 170 "789","empName":"gavin","street":"zhaojiabang"},"age":0,"name":"gavin","salary":300000,"sexy":"m"}?

XStream json 183 {"employee":{"name":"gavin","age":0,"address":{"street":"zhaojiabang","country":"china","city":"shanghai","doorNum":789,"empName":"gavin"},"salary":300000,"isActive":true,"sexy":"m"}}


  时间(转换次数1000000):

方式?时间(ms)?Json lib?185638?XStream xml?247863XStream json395624

?
?

  Xstream xml方式比json lib慢:62s?
  Xstream json方式比xstream xml慢:147s?


  如何选择:?
  JSON:?
  只是纯粹数据转换的方式,如果不需要命名空间,验证,XSLT等xml的功能,可以考虑使用。但是JSON规范还存在一些不支持的情况,比如当Address类中也有Employee类的引用时,转换就会抛出异常。要说明的是jettison应该是xml和json之间转换的工具,xstream利用jettison完成java对象到xml再到json的转换,这样性能就更糟糕了。而且xstream json有很多不满足json规范的地方,比如一个空string在json规范中会转成null,而在xstream json中会转换成””, 所以在使用xstream json消费其他json工具生产的json字符串时就会出现问题。但Json lib提供了JSonConfig类解决了这个问题。如果进行xml和json之间的转换可以考虑使用jettison。?
  Xstream不需要关心xml schema验证,它比json好的一个地方是它可以自动处理引用的表达方式,比如多个变量重复引用同一个对象,循环引用等,如;?
<employee reference="../.."/>。?
  它的API使用太方便了,?
XStream xstream = new XStream();?
String xml = xstream.toXML(employee);?
Employee xsEmployee = (Employee) xstream.fromXML(xml);?
  Xstream自定义和扩展功能也很强大,如用户可以通过converter来实现自己类型的转换逻辑。?
  现在我们有个项目需要设计一个通用的web service agent,根据客户端提供的类名,方法名,参数等调用本地的方法。这样可能需要一种统一的数据格式和处理方式,考虑传的参数可能出现互相引用的情况,还有可读性,将来的扩展性等问题决定默认方式还是使用xstream来转换。?

?

?

热点排行