1. 程式人生 > >各種JSON比較(josn-lib,jackson,gson,fastjson)

各種JSON比較(josn-lib,jackson,gson,fastjson)

一 、各個JSON技術的簡介和優劣

1.json-lib

        json-lib最開始的也是應用最廣泛的json解析工具,json-lib 不好的地方確實是依賴於很多第三方包,包括commons-beanutils.jar,commons-collections.jar,commons-lang.jar,commons-logging.jar,ezmorph-1.0.6.jar,對於複雜型別的轉換,json-lib對於json轉換成bean還有缺陷,比如一個類裡面會出現另一個類的list或者map集合,json-lib從json到bean的轉換就會出現問題。

json-lib在功能和效能上面都不能滿足現在網際網路化的需求。

2.開源的Jackson

       相比json-lib框架,Jackson所依賴的jar包較少,簡單易用並且效能也要相對高些。而且Jackson社群相對比較活躍,更新速度也比較快。Jackson對於複雜型別的json轉換bean會出現問題,一些集合Map,List的轉換出現問題。Jackson對於複雜型別的bean轉換Json,轉換的json格式不是標準的Json格式。

3.Google的Gson

      Gson是目前功能最全的Json解析神器,Gson當初是為因應Google公司內部需求而由Google自行研發而來,但自從在2008年五月公開發布第一版後已被許多公司或使用者應用。
Gson的應用主要為toJson與fromJson兩個轉換函式,無依賴,不需要例外額外的jar,能夠直接跑在JDK上。
而在使用這種物件轉換之前需先建立好物件的型別以及其成員才能成功的將JSON字串成功轉換成相對應的物件。類裡面只要有get和set方法,Gson完全可以將複雜型別的json到bean或bean到json的轉換,是JSON解析的神器。

Gson在功能上面無可挑剔,但是效能上面比FastJson有所差距。

4.阿里巴巴的FastJson
       Fastjson是一個Java語言編寫的高效能的JSON處理器,由阿里巴巴公司開發。無依賴,不需要例外額外的jar,能夠直接跑在JDK上。
FastJson在複雜型別的Bean轉換Json上會出現一些問題,可能會出現引用的型別,導致Json轉換出錯,需要制定引用。

FastJson採用獨創的演算法,將parse的速度提升到極致,超過所有json庫。

       綜上4種Json技術的比較,在專案選型的時候可以使用Google的Gson和阿里巴巴的FastJson兩種並行使用,如果只是功能要求,沒有效能要求,可以使用google的Gson,如果有效能上面的要求可以使用Gson將bean轉換json確保資料的正確,使用FastJson將Json轉換Bean。

二、Google的gson使用簡介

Gson類:解析json的最基礎的工具類
JsonParser類:解析器來解析JSON到JsonElements的解析樹
JsonElement類:一個類代表的JSON元素
JsonObject類:JSON物件型別
JsonArray類:JsonObject陣列
TypeToken類:用於建立type,比如泛型List<?>

(1) bean轉換json

Gson gson = new Gson();

String json = gson.toJson(obj);  //obj是物件

(2)json轉換bean

Gson gson = new Gson();

String json = "{\"id\":\"2\",\"name\":\"Json技術\"}";

Book book = gson.fromJson(json, Book.class);

(3)json轉換複雜的bean,比如List,Set

將json轉換成複雜型別的bean,需要使用TypeToken

Gson gson = new Gson();

String json = "[{\"id\":\"1\",\"name\":\"Json技術\"},{\"id\":\"2\",\"name\":\"java技術\"}]";

//將json轉換成List

List list = gson.fromJson(json,new TypeToken<LIST>() {}.getType());

//將json轉換成Set

Set set = gson.fromJson(json,new TypeToken<SET>() {}.getType());

(4) 通過json物件直接操作json以及一些json的工具

a)格式化Json

String json = "[{\"id\":\"1\",\"name\":\"Json技術\"},{\"id\":\"2\",\"name\":\"java技術\"}]";

Gson gson = new GsonBuilder().setPrettyPrinting().create();

JsonParser jp = new JsonParser();

JsonElement je = jp.parse(json);

json = gson.toJson(je);

b)判斷字串是否是json,通過捕捉的異常來判斷是否是json

String json = "[{\"id\":\"1\",\"name\":\"Json技術\"},{\"id\":\"2\",\"name\":\"java技術\"}]";

boolean jsonFlag;

try {

new JsonParser().parse(str).getAsJsonObject();

jsonFlag = true;

} catch (Exception e) {

jsonFlag = false;

}

c)從json串中獲取屬性

String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";

String propertyName = 'id';

String propertyValue = "";

try {

JsonParser jsonParser = new JsonParser();

JsonElement element = jsonParser.parse(json);

JsonObject jsonObj = element.getAsJsonObject();

propertyValue = jsonObj.get(propertyName).toString();

} catch (Exception e) {

propertyValue = null;

}

d)除去json中的某個屬性

String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";

String propertyName = 'id';

JsonParser jsonParser = new JsonParser();

JsonElement element = jsonParser.parse(json);

JsonObject jsonObj = element.getAsJsonObject();

jsonObj.remove(propertyName);

json = jsonObj.toString();

e)向json中新增屬性

String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";

String propertyName = 'desc';

Object propertyValue = "json各種技術的調研";

JsonParser jsonParser = new JsonParser();

JsonElement element = jsonParser.parse(json);

JsonObject jsonObj = element.getAsJsonObject();

jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));

json = jsonObj.toString();

f)修改json中的屬性

String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";

String propertyName = 'name';

Object propertyValue = "json各種技術的調研";

JsonParser jsonParser = new JsonParser();

JsonElement element = jsonParser.parse(json);

JsonObject jsonObj = element.getAsJsonObject();

jsonObj.remove(propertyName);

jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));

json = jsonObj.toString();

g)判斷json中是否有屬性

String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";

String propertyName = 'name';

boolean isContains = false ;

JsonParser jsonParser = new JsonParser();

JsonElement element = jsonParser.parse(json);

JsonObject jsonObj = element.getAsJsonObject();

isContains = jsonObj.has(propertyName);

h)json中日期格式的處理

GsonBuilder builder = new GsonBuilder();

builder.setDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

Gson gson = builder.create();

然後使用gson物件進行json的處理,如果出現日期Date類的物件,就會按照設定的格式進行處理

i)json中對於Html的轉義

Gson gson = new Gson();

這種物件預設對Html進行轉義,如果不想轉義使用下面的方法

GsonBuilder builder = new GsonBuilder();

builder.disableHtmlEscaping();

Gson gson = builder.create();

三、Alibaba的fastjson使用簡介

Fastjson API入口類是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON類上的靜態方法直接完成。 public static final Object parse(String text); // 把JSON文字parse為JSONObject或者JSONArray 
public static final 
JSONObject parseObject(String text); // 把JSON文字parse成JSONObject    
public static final 
<T> T parseObject(String text, Class<T> clazz); // 把JSON文字parse為JavaBean 
public static final 
JSONArray parseArray(String text); // 把JSON文字parse成JSONArray 
public static final 
<T> List<T> parseArray(String text, Class<T> clazz); //把JSON文字parse成JavaBean集合 
public static final 
String toJSONString(Object object); // 將JavaBean序列化為JSON文字 
public static final 
String toJSONString(Object object, boolean prettyFormat); // 將JavaBean序列化為帶格式的JSON文字 
public static final 
Object toJSON(Object javaObject); 將JavaBean轉換為JSONObject或者JSONArray。
SerializeWriter:相當於StringBuffer JSONArray:相當於List<Object> JSONObject:相當於Map<String, Object> JSON反序列化沒有真正陣列,本質型別都是List<Object> fastjson還有很多很高階的特性,比如支援註解、支援全型別序列化,這些都是很好的特性,功能強大