最近爲了統一項目中使用的框架,發現項目中用到了兩種json解析框架,他們就是當今很是主流的json解析框架:google的Gson 和阿里巴巴的FastJson,爲了廢除其中一個因此來個性能和使用的大比拼。json
當前版本: fastjson-1.2.14.jar框架
下載地址http://repo1.maven.org/maven2/com/alibaba/fastjson/1.2.14/maven
對象轉化成json:性能
/** * 對象轉化爲json fastjson 使用方式 * * @return */ public static String objectToJsonForFastJson(Object object) { if (object == null) { return ""; } try { return JSON.toJSONString(object); } catch (JSONException e) { } catch (Exception e) { } return ""; }
json轉化成對象:測試
/** * json轉化爲對象 fastjson 使用方式 * * @return */ public static <T> T jsonToObjectForFastJson(String jsonData, Class<T> clazz) { if (TextUtils.isEmpty(jsonData)) { return null; } try { return parseObject(jsonData, clazz); } catch (Exception e) { } return null; }
json轉化成List:大數據
/** *json轉化爲List fastjson 使用方式 */ public static List jsonToListForFastJson(String jsonData) { if (TextUtils.isEmpty(jsonData)) { return null; } List arrayList = null; try { arrayList = parseObject(jsonData,new TypeReference<ArrayList>(){}); } catch (Exception e) { } return arrayList; }
json轉化這Map:gradle
/** *json轉化爲Map fastjson 使用方式 */ public static Map jsonToMapForFastJson(String jsonData){ if (TextUtils.isEmpty(jsonData)) { return null; } Map map = null; try{ map = parseObject(jsonData,new TypeReference<Map>(){}); }catch (Exception e){ e.printStackTrace(); } return map; }
當前版本2.40 ui
使用方式 build.gradle 中配置 compile 'com.google.code.gson:gson:2.4'this
對象轉化json:google
/** * 對象轉化爲json對象 Gson 使用方式 * * @return */ public static String objectToJsonForGson(Object object) { if (object == null) { return ""; } Gson gson; try { gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); return gson.toJson(object); } catch (Exception e) { e.printStackTrace(); } return ""; }
json轉化成對象:
/** * json轉化爲對象 Gson 使用方式 * * @return */ public static <T> T jsonToObjectForGson(String jsonData, Class<T> clazz) { if (TextUtils.isEmpty(jsonData)) { return null; } T finalResult = null; try { Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); finalResult = gson.fromJson(jsonData, clazz); } catch (Exception e) { e.printStackTrace(); } return finalResult; }
json轉化成List:
/** *json轉化爲集合 Gson 使用方式 */ public static List jsonToListForForGson(String jsonData) { if (TextUtils.isEmpty(jsonData)) { return null; } List list = null; try { Type listType = new TypeToken<ArrayList>() { }.getType(); Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); list = gson.fromJson(jsonData, listType); } catch (Exception e) { } return list; }
json轉化爲Map:
/** *json轉化爲Map fastjson 使用方式 */ public static Map jsonToMapForForGson(String jsonData){ if (TextUtils.isEmpty(jsonData)) { return null; } Map map = null; try { Type listType = new TypeToken<Map>() { }.getType(); Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); map = gson.fromJson(jsonData, listType); } catch (Exception e) { } return map; }
測試性能程序:
第一步:首先建立一個實體對象Person
public class Person { private String name;//姓名 private int age;//年齡 public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
第二部:建立一個測試集合:
List<Person> personList=new ArrayList<>(); int testMaxCount=1000;//測試的最大數據條數 //添加測試數據 for(int i=0;i<testMaxCount;i++){ Person person =new Person(); person.setAge(i); person.setName(String.valueOf(i)); personList.add(person); }
分別執行二者的轉化和解析代碼:
//FastJson生成json數據 long start=System.currentTimeMillis(); String jsonData=JsonUtils.objectToJsonForFastJson(personList); long end=System.currentTimeMillis(); Log.e("MainActivity","FastJson生成json數據 cost time---->"+(end-start)); //FastJson解析json數據 start=System.currentTimeMillis(); List<Person> tempPersons=JsonUtils.jsonToListForFastJson(jsonData); end=System.currentTimeMillis(); Log.e("MainActivity","FastJson解析json數據 cost time---->"+(end-start)); //Gson生成json數據 start=System.currentTimeMillis(); jsonData=JsonUtils.objectToJsonForGson(personList); end=System.currentTimeMillis(); Log.e("MainActivity","Gson生成json數據 cost time---->"+(end-start)); //Gson解析json數據 start=System.currentTimeMillis(); List<Person> tempPersons1=JsonUtils.jsonToListForForGson(jsonData); end=System.currentTimeMillis(); Log.e("MainActivity","Gson解析json數據 cost time---->"+(end-start));
重點看執行結果:單位毫秒(執行時間)
二者轉換性能對比:1000條 10000條 100000條 200000條
fastJson : 45 289 4010 8396
Gson : 60 724 4071 8803
二者解析性能對比:1000條 10000條 100000條 200000條
fastJson : 55 552 3826 8638
Gson : 45 465 5942 9668
總結:在數據量比較小的狀況下,二者性能相差無幾,在數據量比較大的狀況下FastJson仍是有優點的。
插曲:爲了項目省事,本人把FastJson給刪除了,結果項目中遺留了一些代碼編寫不規範的狀況,好比userId 寫成了useid 可是json數據中返回的是userId,以前用FastJson一直正常這才發現原來FastJson對實體屬性是忽略大小寫的,真是一個神奇的東西。