对比XStream和JSON

XStream是thoughtworks开发的开源产品,采用的是xpp来进行xml和对象之间的转换。 它不需要schema或其他的mapping文件就可以进行java对象和xml文件之间的转换,API调 用起来非常方便,并且扩展功能强大。

网址:http://xstream.codehaus.org

JSON是目前比较流行的轻量级的对象数据转换方式,常常用在ajax和web service领域 。目前大部分语言都有JSON的实现。Java领域有json lib,还有xstream json(jettison) 。

网址:http://json-lib.sourceforge.net/

http://jettison.codehaus.org

主要是对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  gavin  0     zhaojiabang   china   shanghai   789   gavin  

 300000.0  true  m Json lib 170 “789”,”empName”:”gavin”,”street”:& quot;zhaojiabang”},”age”:0,”name”:”gavin”,& quot;salary”:300000,”sexy”:”m”} XStream json 183 {“employee”: {“name”:”gavin”,”age”:0,”address”: {“street”:”zhaojiabang”,”country”:”china&qu ot;,”city”:”shanghai”,”doorNum”:789,”empNam e”:”gavin”},”salary”:300000,”isActive”:true ,”sexy”:”m”}}

时间(转换次数1000000):

方式 时间(ms) Json lib 185638 XStream xml 247863 XStream json 395624

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好的一个地方是它可以自动处理引用的 表达方式,比如多个变量重复引用同一个对象,循环引用等,如;

它的API使用太方便了,

XStream xstream = new XStream();String xml = xstream.toXML(employee);Employee xsEmployee = (Employee) xstream.fromXML(xml);

Xstream自定义和扩展功能也很强大,如用户可以通过converter来实现自己类型的转 换逻辑。

现在我们有个项目需要设计一个通用的web service agent,根据客户端提供的类名, 方法名,参数等调用本地的方法。这样可能需要一种统一的数据格式和处理方式,考虑传 的参数可能出现互相引用的情况,还有可读性,将来的扩展性等问题决定默认方式还是使 用xstream来转换。

而在于当时的那份心情。可是旅行的彼时那刻我的心情一直是好的吗?

对比XStream和JSON

相关文章:

你感兴趣的文章:

标签云: