Json解析工具的选择

时间:2022-02-11 17:55:26

前言

前段时间@寒江不钓同学针对国内Top500和Google Play Top200 Android应用做了全面的分析(具体分析报告见文末的参考资料),其中有涉及到对主流应用使用json框架Gson、FastJson、Jackson的统计,具体情况如下:

Json解析工具的选择
可见无论是在国内还是国际上,有很多应用会用到json框架,其中谷歌提供的gson框架是被使用得最多的,老牌json框架Jackson属于小众,阿里出品的FastJson在国内的使用情况仅次于Gson,但在国际上却基本没有APP在使用。

(前言摘自https://zhuanlan.zhihu.com/p/21919300)
 
 
被使用得最多并不代表就一定是最优方案,在使用json框架的过程中,我们最关注的应该是效率和易用性的问题。由于本人对Jackson不太熟悉,Jackson也比较小众,而且Jackson依赖包是三个中最大的,效率优势不明显,所以
我首先排除了Jackson。
 
1.Google的Gson(框架描述摘自http://www.cnblogs.com/kunpengit/p/4001680.html)
Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,
但自从在2008年五月公开发布第一版后已被许多公司或用户应用。
Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。
而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。
类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
2.阿里巴巴的FastJson
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
 
Gson、FastJson到底哪一个效率更高,速度更快?(效率比较摘自http://blog.csdn.net/zml_2015/article/details/52165317)
 
来个单元测试:
 
循环50次再求平均值:

@org.junit.Test
public void TestSpeed() throws Exception {

List<Foods> foods = foodDao.selectAll(Foods.class);

System.out.println("-------------gson-----------");
long gsonStart = System.currentTimeMillis();
gsonC(foods);//用Gson进行拆包 和 解析 并循环操作50次
long gsonEnd = System.currentTimeMillis();
System.out.println("gsonGaps:" + (gsonEnd - gsonStart) / 50);
System.out.println("-------------gson-----------");

System.out.println("-------------FastJson-----------");
long fastStart = System.currentTimeMillis();
fastJsonC(foods);// 用FastJson进行拆包 和 解析 并循环操作50次
long fastEnd = System.currentTimeMillis();
System.out.println("gsonGaps:" + (fastEnd - fastStart) / 50);
System.out.println("-------------FastJson-----------");

System.out.println("-------------JSON-----------");
long jsonStart = System.currentTimeMillis();
jsonC(foods);// 用org.json进行拆包 和 解析 并循环操作50次
long jsonEnd = System.currentTimeMillis();
System.out.println("gsonGaps:" + (jsonEnd - jsonStart) / 50);
System.out.println("-------------JSON-----------");

}

调用的方法必须是 synchronized 同步的,即运行完该方法后才执行下面的代码

private synchronized void jsonC(List<Foods> foods) throws Exception {
for (int j = 0; j < 50; j++) {
String jsonString = JsonTools.createJsonString("json", foods);
JSONObject object = new JSONObject(jsonString);
JSONArray array = object.getJSONArray("json");
List<Foods> list2 = new ArrayList<Foods>();
for (int i = 0; i < array.length(); i++) {

JSONObject foodObject = (JSONObject) array.get(i);
Foods foods2 = new Foods(foodObject.getInt("id"),
foodObject.getString("cookclass"),
foodObject.getString("name"),
foodObject.getString("description"),
foodObject.getString("food"),
foodObject.getString("img"),
foodObject.getString("images"),
foodObject.getString("keywords"),
foodObject.getString("message"),
foodObject.getString("url"));
list2.add(foods2);
}
String s3 = list2.toString();
}
}

private synchronized void fastJsonC(List<Foods> foods) {
for (int i = 0; i < 50; i++) {
String fastString = FastJsonTools.createJsonString(foods);
String s2 = FastJsonTools.createJsonToListBean(fastString,
Foods.class).toString();
}
}

private synchronized void gsonC(List<Foods> foods) {
for (int i = 0; i < 50; i++) {
String gsonString = GsonTools.createJsonString(foods);
String s1 = GsonTools.StringTolist(gsonString, Foods[].class)
.toString();
}
}

然后贴一下解析1万条数据2万条数据100条数据各个类库所用的的平均时间(这个时间不包括查询数据库所用的时间)
1.1万 
Json解析工具的选择
2. 2万 
Json解析工具的选择

3.100条

Json解析工具的选择

经过这次测试之后,确实验证了阿里巴巴的FastJson相对来说是挺快的。因为fastjson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,所以我决定还是fastjson和gson并用,

不要求效率的话就用gson,要求高效率的话就用fastjson。