前言:
最近为了统一项目中使用的框架,发现项目中用到了两种json解析框架,他们就是当今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,为了废除其中一个所以来个性能和使用的大比拼。
FastJson 当前使用版本 fastjson-1.2.11.jar 下载地址http://repo1.maven.org/maven2/com/alibaba/fastjson/1.2.11/
对象转化成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 当前使用版本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对实体属性是忽略大小写的,真是一个神奇的东西。