Android總結之json解析(FastJson Gson 對比)

總李寫程式碼發表於2016-05-07

前言:

最近為了統一專案中使用的框架,發現專案中用到了兩種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對實體屬性是忽略大小寫的,真是一個神奇的東西。 

相關文章