Android总结之json解析(FastJson Gson 对比)

前言:

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

上一篇:教你正确打开async/await关键字的使用


下一篇:C#多线程之基础篇3