专栏首页Open软件开发小组[Json框架选型]Android开发中应该使用哪一种主流json框架?

[Json框架选型]Android开发中应该使用哪一种主流json框架?

前言

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

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

提示:点击文末的阅读原文可查看本文带链接的版本。

测试方案

被使用得最多并不代表就一定是最优方案,在使用json框架的过程中,我们最关注的应该是效率和易用性的问题,三种框架的具体实现各不相同,肯定会存在效率和易用性上的差异,针对这两方面的分析网络上的文章并没有比较权威、能够说服大家的观点(FastJson引用的测试结果可以参考,但不足以说服所有人),本文结合工作中的实际情况,使用三种框架分别对bean转String、String转bean、List转String、String转List、Map转String、String转Map这几种情况进行实际测试,得出在耗时、CPU占用、内存变化、易用性上的测试结果。

为了让测试结果显得更为可信,有必要说明一下测试方案:

  • 使用相同的测试环境:入参相同(数据来源、测试次数)、运行的环境相同;
  • 每个框架都使用最新的版本,如果有Android定制版优先使用Android定制版(Gson:2.7、FastJson:1.1.52.android、jackson:jackson-all-1.9.9);
  • 为了避免单次测试可能存在的不确定性因素,每个框架的每次测试都是重复测试100次,然后算平均值;
  • 为了观察不同量级的数据量对效率的影响,数据量可以人为设置,测试时分别从10的0次方到10的4次方,每次测试以10为倍数的增长方式(即1、10、100、1000、10000,根据实际情况,测试10万次就显得不是很必要了,如果数据量太大,可以考虑分多次获取和转换)观察不同框架在不同量级数据的表现情况;
  • 考虑到生成数据也会导致耗时的问题,对每个框架的每次测试,100次的测试中只生成一次数据;
  • 考虑到测试的可操作性,对每个框架的每次测试中,bean转String、String转bean、List转String、String转List、Map转String、String转Map都是一并进行的,所以对内存变化和CPU变化的测试结果是这六项测试的综合结果。

考虑到可读性和代码量的问题,直接提供链接会比贴代码好一点:

ParseJson4Android

测试结果

详细的测试结果如下:

结合本人实际操作和测试结果,可以得出如下结论:

  • 三种框架在实现上都使用了反射机制;
  • 三种框架目前仍然在维护,所以从这一点来讲,使用任何一个框架是靠谱的,因为有人在维护,反馈问题可以改,遇到问题也可以问;
  • 三种框架FastJson的包最小(为了方便对比大小,均是对jar包做的统计),只有196K,其次是Gson的227K,Jackson会大很多,超过了1M;
  • 三种框架在1000倍数据量级以内效率都很高、占用内存也低,效率最高的是FastJson,内存占用都差不多;1000倍数据量级以上内存占用会很大,并且平均耗时会超过1S,FastJson表现中规中矩;
  • json解析、转换是一件很耗CPU的工作;
  • 三种框架在bean转换为json时都有很好的易用性,但在json解析的实现上,FastJson使用起来最简单,其次是Gson;
  • FastJson对bean有要求,必须要有默认的构造函数,如果bean类没有默认的构造函数并且是无法修改的(比如拿不到源码),相比于另外两个框架会有弱势。

综合上述各方面的测试结果,并结合实际工作情况来看(如果数据量很大,可以考虑分页,多次获取),在项目中应该优先使用FastJson框架,它在一定数据量范围内,内存占用、效率等方面会表现得更为优秀;其次才是Gson(结合实际工作经验,频繁的使用json解析和转换更应该使用FastJson)。如果有涉及到无法修改并且没有默认构造方法的bean类,则应该优先考虑使用Gson。

特别说明

由于测试方案、测试环境以及具体用法并不一定权威,所以测试结果仅供参考,在实际开发过程中可以借鉴本文的测试结论,但建议在任何开源项目的选型前,还是要亲自动手,对性能、效率、易用性、功耗、大小、是否有人在维护、稳定性等各方面进行测试,根据综合分析后的结果选择最适合自己项目的框架。

参考资料

  • 测试Demo
  • gson
  • FastJson Android版本
  • Jackson
  • FastJson 使用详解
  • gson使用详解
  • Google Play Top200 应用分析报告
  • 国内Top500Android应用分析报告

本文分享自微信公众号 - Open软件开发小组(open_dev),作者:张明云

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-08-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RxJava之初体验

    RxJava – Reactive Extensions for the JVM – a library for composing asy...

    open
  • Android Binder 分析系列——原理(上)

    分析之前说一下原理。为要 android 要搞这么复杂的一个东西。那是因为 android 是个多进程的系统,进程间的数据交换、相互调用(某几...

    open
  • 每个开发者都应该了解的游戏引擎知识

    游戏引擎主要用于快速开发游戏,将游戏中固定不变的处理抽取出来,形成完整的游戏主体,用户只需要对开放的接口进行对象设计和驱动即可。在当前的环境,还...

    open
  • AS3解析FLV格式和视频相关问题总结

    在直播项目里面遇到需要统计flash视频帧间隔时长,首帧,GOP,等关键数据的时候,不可避免的需要对flv文件进行解析。

    IMWeb前端团队
  • AS3解析FLV格式和视频相关问题总结

    为什么要解析FLV格式? 在直播项目里面遇到需要统计flash视频帧间隔时长,首帧,GOP,等关键数据的时候,不可避免的需要对flv文件进行解析。 名词定义 首...

    IMWeb前端团队
  • 【Excel系列】Excel数据分析:时间序列预测

    移动平均 18.1 移动平均工具的功能 “移动平均”分析工具可以基于特定的过去某段时期中变量的平均值,对未来值进行预测。移动平均值提供了由所有历史数据的简单的平...

    数据科学社区
  • PowerBI大师视频课程全面上线

    亲爱的朋友们,在这个粉丝稀少的年代,承蒙各位丰厚的鼓励和支持。过去的几个月里,我开始尝试录制视频作品,做PPT,学习视频录制、剪辑软件、注册课堂到审核通过发布。...

    公众号PowerBI大师
  • Java 如何把 php 数组转换为 json 数据

    最近做一些网站的数据迁移,遇到数据库的某个字段存的数据既有 json 数据,也有 php 数组的字符串。

    格姗知识圈
  • Java中的String,StringBuilder,StringBuffer三者的区别

    String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象...

    赵哥窟
  • iOS 视频播放方式整理

    初衷 ----       多媒体这整个系列的文章自己也准备好开始整理了,先从视频音频最简单也是最常用的播放出发慢慢的往下深究,探索到底层的编码解码等等,这篇文...

    Mr.RisingSun

扫码关注云+社区

领取腾讯云代金券