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

前言:

最近爲了統一項目中使用的框架,發現項目中用到了兩種json解析框架,他們就是當今很是主流的json解析框架:google的Gson 和阿里巴巴的FastJson,爲了廢除其中一個因此來個性能和使用的大比拼。json

FastJson簡介:Fastjson是一個Java語言編寫的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;
    }

Gson 簡介:Gson由谷歌研發,能夠把Java對象轉換成JSON,也能夠把JSON字符串轉換成一個相等的Java對象。Gson支持任意複雜Java對象包括沒有源代碼的對象。

當前版本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對實體屬性是忽略大小寫的,真是一個神奇的東西。 

相關文章
相關標籤/搜索