前言:
最近為了統一專案中使用的框架,發現專案中用到了兩種json解析框架,他們就是當今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,為了廢除其中一個所以來個效能和使用的大比拼。
FastJson簡介:Fastjson是一個Java語言編寫的JSON處理器,由阿里巴巴公司開發。
當前版本: fastjson-1.2.14.jar
下載地址http://repo1.maven.org/maven2/com/alibaba/fastjson/1.2.14/
物件轉化成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:
/** *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; }
Gson 簡介:Gson由谷歌研發,可以把Java物件轉換成JSON,也可以把JSON字串轉換成一個相等的Java物件。Gson支援任意複雜Java物件包括沒有原始碼的物件。
當前版本2.40
使用方式 build.gradle 中配置 compile 'com.google.code.gson:gson:2.4'
物件轉化json:
/** * 物件轉化為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對實體屬性是忽略大小寫的,真是一個神奇的東西。