程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 對比XStream和JSON

對比XStream和JSON

編輯:關於JAVA

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 <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":& 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好的一個地方是它可以自動處理引用的 表達方式,比如多個變量重復引用同一個對象,循環引用等,如;

<employee reference="../.."/>。

它的API使用太方便了,

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

Xstream自定義和擴展功能也很強大,如用戶可以通過converter來實現自己類型的轉 換邏輯。

現在我們有個項目需要設計一個通用的web service agent,根據客戶端提供的類名, 方法名,參數等調用本地的方法。這樣可能需要一種統一的數據格式和處理方式,考慮傳 的參數可能出現互相引用的情況,還有可讀性,將來的擴展性等問題決定默認方式還是使 用xstream來轉換。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved