Android中JSON库性能比较

4,534 阅读3分钟

JSON不管是在Web开发还是服务器开发中是相当常见的数据传输格式,一般情况我们对于JSON解析构造的性能并不需要过于关心,除非是在性能要求比较高的系统。 目前对于Java开源的JSON类库有很多种,下面我们取四个常用的JSON库进行性能测试对比,同时根据测试结果分析如果根据实际应用场景选择最合适的JSON库。JSON类库分别为:JSONObject、Gson、FastJson和Jackson。 简单介绍下四个类库的身份背景。

  • JSONObject:Android原生提供的Json处理API。其核心是JSONObject和JSONArray两个类。
  • Gson:Gson是目前功能最全的Json解析工具,Gson当初是为因应Google公司内部需求而由Google自行研发而来。Gson的应用主要为toJson与fromJson两个转换函数。而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
  • FastJson:Fastjson是一个Java语言编写的高性能的JSON处理器。FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
  • Jackson:基于事件驱动,与GSON相同,先创建一个对应于JSON数据的JavaBean类就可以通过简单的操作解析出所需JSON数据。但和Gson解析不同的是,GSON可按需解析,Jackson无法按需解析。

选择一个合适的JSON库要从多个方面进行考虑:序列化与序列化的耗时及内存的消耗,还有就是代码操作是否简单。

针对这三种Json处理方案,我们以真实数据进行测试比较:分别使用三种方式进行普通Object类的序列化与反序列化、List类的序列化和反序列化,处理量级分别是10、100、1000和10000的情况下,比较这些操作的耗时与内存消耗,最终得出结果如下:

List反序列化

List序列化

普通Object反序列化

普通Object序列化

内存消耗

上图中的数据,都进行了四次实验并取平均值所得。

由上述统计数据得出:

  • 反序列化操作:总体来说,JSONObject处理速度最优,无论是处理普通Object还是List集合;
  • 反序列化操作:随着处理量级的增大,Gson库更加费时;
  • 序列化操作:总体依旧是JSONObject处理速度最快,然后是FastJson,Gson,Jackson最差;
  • FastJson操作,处理量级对内存消耗影响不大,所耗内存相对较少;
  • 进行大量操作时,JSONObject内存消耗明显增加,高于其他两种方式;
  • Jackson在序列化和反序列化时耗时都是最长的,内存消耗也是最大的,所以不建议使用Jackson。

综上,当数据量级不大时,从内存消耗和处理速度考虑,都应首选JSONObject,但JSONObject代码繁杂,容易出错,当数据量大时,不建议使用JSONObject,是因为其消耗内存过大,容易引发异常。

数据量不大时,Gson与FastJson性能相当,FastJson稍优于Gson,但处理大量数据时,FastJson在内存消耗方面有明显优势。