Android json解析(FastJson Gson 对比)

来源:互联网 发布:windows 没有远程桌面 编辑:程序博客网 时间:2024/05/17 03:22

前言:

最近为了统一项目中使用的框架,发现项目中用到了两种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对实体属性是忽略大小写的,真是一个神奇的东西。 

干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!