Gson和Fastjson
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gson和Fastjson相关的知识,希望对你有一定的参考价值。
参考技术A 谷歌的Gson:Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。
阿里巴巴的FastJson:
无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
结论:
在项目选型的时候可以使用Google的Gson和阿里巴巴的FastJson两种并行使用,
如果只是功能要求,没有性能要求,可以使用google的Gson,
如果有性能上面的要求可以使用Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean
Gson 和 FastJson 性能测试
使用版本:
compile ‘com.google.code.gson:gson:2.7‘ compile ‘com.alibaba:fastjson:1.2.17‘
评测样板为一个People数组,People对象 中包含一个Food对象引用。各个字符串采用随机数模拟;尽量模拟列表请求数据。
String mString = "abcdefghijklmnopqrstuvwxyz0123456789";
Random mRandom = new Random();
public List<People> createPeopleList(int n){ List<People> list = new ArrayList<>(); for (int i=0; i< n ; i++){ list.add(createPeople()); } return list; } public People createPeople(){ People people = new People(); people.name = getRandomString(); people.age = Math.abs(mRandom.nextInt()) % 100; people.food = createFood(); return people; } public Food createFood(){ Food food = new Food(); food.name = getRandomString(); food.num = Math.abs(mRandom.nextInt()) % 10; food.price = Math.abs(mRandom.nextInt()) % 100; return food; } public String getRandomString(){ int size = Math.abs(mRandom.nextInt()) % 6; String str = ""; int len = mString.length(); for(int i=0; i< size; i++){ str += mString.charAt(Math.abs(mRandom.nextInt()) % len); } return str; }
评测Demo:
public String testToJson(int n){ mText = ""; List list = createPeopleList(n); long startTime = System.currentTimeMillis(); Gson gson = new Gson(); long initTime = System.currentTimeMillis(); String gsonStr = gson.toJson(list); long parseTime = System.currentTimeMillis(); String gsonTime = "gson to initTime: "+(initTime - startTime) +" parse: "+(parseTime - initTime); startTime = System.currentTimeMillis(); String fastStr = JSON.toJSON(list).toString(); parseTime = System.currentTimeMillis(); String fastTime = "fast to parse: "+(parseTime - startTime); mText = gsonTime + "\n" + fastTime; // Log.d("tag", gsonStr); // Log.d("tag", fastStr); return gsonStr; } public Object testFromJson(String str){ List<People> list = new ArrayList<>(); long startTime = System.currentTimeMillis(); Gson gson = new Gson(); long initTime = System.currentTimeMillis(); list = gson.fromJson(str, list.getClass()); long parseTime = System.currentTimeMillis(); String gsonTime = "gson from initTime: "+(initTime - startTime) +" parse: "+(parseTime - initTime); startTime = System.currentTimeMillis(); list = JSON.parseObject(str, list.getClass()); parseTime = System.currentTimeMillis(); String fastTime = "fast from parse: "+(parseTime - startTime); mText += "\n"+gsonTime + "\n" + fastTime; return list; }
评测机型:360 型号1503-M02, 处理器:helio X20 十核处理器, 内存4G, 系统6.0, 内核版本3.18.22+
输出数据:
Size 大小 GSON toJson FastJson toJson GSON fromJson FastJson parseJson 单位(ms)
20 25 39 6 3
30 39 6 2
27 40 6 3
200 22 15 12 11
23 16 13 12
22 15 11 12
2000 116 87 43 61
128 83 72 89
120 85 44 73
20000 610 766 596 666
709 793 525 759
530 910 543 773
200000 6875 15394 11551 18811
6803 15419 10050 18718
6756 15217 11338 19507
数据分析:
1、Size 为 20 的时候 数据偏大是因为有静态变量等相关的初始化工作,接下来的 200、2000等因为已经初始化了,所以没有相应增加时间。
2、生成json字符串的速度,2000个对象以内,fastJson 有优势, 20000个数据以上Gson优势比较大
3、解析json字符串的数据, 除了20个样板的极端例子,Gson 的解析性能都有可观的优势。
总结:
1、android开放中,按照以往经验解析json样板 不超过2000, 封装json的样板不超过200,选择Gson有一定优势。
2、FastJson整体表现不如Gson,但是在特定样板大小中,有更好的性能。
3、GitHub上面FastJson更新比Gson更慢
4、建议使用Gson
5、上述样板存在局限,没有覆盖到很多样例,具体项目中,可以实测之后在选择方案。
以上是关于Gson和Fastjson的主要内容,如果未能解决你的问题,请参考以下文章
FastJSONFastJson转换json字符串key的首字母小写变大写的解决办法