关闭

Android Jackson、Gson、FastJson解析框架对比

标签: 开源框架androidjacksongsonfastjson
4040人阅读 评论(0) 收藏 举报
分类:

目前Android在使用的Json解析框架主要有Jackson、Gson、FastJson、org.json;
因为Android Studio自带的org.json解析 XML 文件时会将整个 XML 文件的内容解析成树型结构存放在内存中并创建新对象,比较消耗时间和内存,解析速度和效率慢,解析方式和性能完败Gson等开源框架,导致org.json慢慢的也在被淘汰,Andorid开发中还在使用org.json的已经很少,所以我们今天暂时不讨论org.json。

OK,接下来我们来一起简单了解下这3个框架:

Jackson

简介:

Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。
Github:https://github.com/FasterXML/jackson

解析原理:

基于事件驱动,与GSON相同,先创建一个对应于JSON数据的JavaBean类就可以通过简单的操作解析出所需JSON数据。但和Gson解析不同的是,GSON可按需解析,即创建的JavaBean类不一定完全涵盖所要解析的JSON数据,按需创建属性,但Jackson解析对应的JavaBean必须把Json数据里面的所有key都有所对应,即必须把JSON内的数据所有解析出来,无法按需解析。但Jackson的解析速度和效率都要比GSON高

优势

解析效率最高
在数据量大的情况优势尤为明显、占存少

缺点

必须完全解析文档,如果要按需解析的话可以拆分Json来读取,操作和解析方法复杂;

推荐使用情景

适用于需要处理超大型JSON文档、不需要对JSON文档进行按需解析、、性能要求较高的场合

关键代码

ObjectMapper objectMapper = new ObjectMapper();
   try {
     InputStreamReader isr = new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("assets/" + "student.json"),"utf-8");
     //从assets获取json文件
     BufferedReader bfr = new BufferedReader(isr);
     String line;
     StringBuilder stringBuilder = new StringBuilder();
     while ((line = bfr.readLine())!=null){
        stringBuilder.append(line);
            }//将JSON数据转化为字符串
            System.out.println(stringBuilder.toString());
            System.out.println(tes.tostring());

        }
}

Gson

简介

Google提供的用来java对象和JSON数据之间进行映射的JAVA类库,可以将一个JSON字符转成一个java对象,反过来也OK。
Github:https://github.com/google/gson

优势

快速,高效
代码量少
面向对象
数据传输解析方便
可按需解析

关键代码

Gson gson = new Gson();
User user = gson.fromJson(jsonData, User.class);

注意事项

1、内部嵌套的类必须是static的,要不然解析会出错;
2、类里面的属性名必须跟Json字段里面的Key是一模一样的;
3、内部嵌套的用[]括起来的部分是一个List,所以定义为 public List< B> b,而只用{}嵌套的就定义为 public C c,
是不是很简单,而且现在android studio上可以直接用插件生成实体类,那更加方便了

FastJson

简介

FastJson是阿里巴巴公司提供的一个用Java语言编写的高性能功能完善的JSON库,该库涉及的最基本功能就是序列化和反序列化。Fastjson支持java bean的直接序列化,同时也支持集合、Map、日期、Enum和泛型等的序列化。你可以使用com.alibaba.fastjson.JSON这个类进行序列化和反序列化,常用的序列化操作都可以在JSON类上的静态方法直接完成。Fastjson采用独创的算法,将parse的速度提升到极致,号称超过所有Json库。而且,使用Fastjson解析时,除了需要使用Fastjson所提供的jar包外,再不需要额外的jar包,就能够直接跑在JDK上。

Github:https://github.com/alibaba/fastjson

优势

快速FAST(比任何一款都快)
面向对象
功能强大(支持普通JDK类任意java bean Class,Collection,Map,Date或者enum)
零依赖(只需要有JDK即可)
支持注解,全类型序列化

关键代码

 User user = JSON.parseObject(json,User.class);

Json框架分析:

ok,上面介绍了Jackson、Gson、FastJson的基本内容,细心的朋友可能发现介绍Gson与FastJson时我并未提及他们的缺点,这里说一下,并不是说这2个框架没有缺点,只是相对与其他的框架他们的缺点并不突出。

上面特别介绍了Jackson的缺点,以及推荐了它使用的场景,那么其他场景下还是不建议大家使用,这点对于开发者来说其实也是需要考虑的一个问题,如果该库的API使用难度大,或者很复杂,那么不建议使用,毕竟JSON解析的性能差异并不大。

那么接下来我们来看看它们的序列化性能、反序列化性能、jar大小

序列化性能

FastJson:1201
Jackson: 1408
Gson : 7421

反序列化性能

FastJson:1216
Jackson: 1915
Gson : 5065

Jar包大小

fastjson-1.1.26.jar(356k)
fastjson-1.1.25-android.jar(226k)

jackson-annotations-2.1.1.jar(34k)
jackson-core-2.1.1.jar(206k)
jackson-databind-2.1.1.jar(922k)

gson-2.2.2.jar(189k)

数据来源:https://github.com/eishay/jvm-serializers/wiki/Staging-Results

这个数据,和我使用测试过程中基本吻合,可信度较大,阿里Github网也引用了这个数据。
ok,那么看到这个数据后你对使用哪个框架已经有了初步印象了吧,这里Jackson在性能上确实要优于Gson,但jar包总共1162k,貌似大了一点追加在加上易用性,也是大部分人抛弃Jackson的根本所在吧。

那么FastJson与Gson具体的性能对于又如何呢,我们来看下面的数据

单位:毫秒

两者转换性能对比:    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还是略优于Gson。

总结与客观推荐:

1、比较来说, Gson 比 fastjson 考虑更全面, 对用 URL , UUID, BIT_SET, CALENDAR 等等,都有特定的输出规则.
2、小数量的调用 Gson 比 fastjson 快一点. (几十毫秒,可以毫不在意.猜测是因为 javassist 生成新的 Wrapper 类导致,因为还要编译的.)
3、大数量的调用 fastjson 比 Gson 快. (千万级别的.还不太确定为什么会变快, 猜测是 gson 的反射调用,毕竟比不上 fastjson Wrapper 类的真实调用.)
4、代码可阅读性: fastjson 比 Gson 好很多很多.
5、fastjson 在要序列化对象的类型的判断上,使用的是 if else 。
6、Gson 使用的是遍历 TypeAdapterFactory集合,在每个 TypeAdapterFactory 里面做判断.而且使用了 N 多的匿名内部类, 想要一眼看出有哪些 TypeAdapterFactory 的实现都很困难.
7、如果普通日常使用,推荐使用 fastjson,简单易懂,并且是国内程序员开发,有问题可以较容易的获得支持.
8、Gson 有对各种类型的属性支持, 如果有特殊类型json化需求或复杂结构时可以选择 gson ,并自定义扩充.
9、如果你不需要对JSON文档进行按需解析、且性能要求较高的话,可以尝试使用Jackson.

当然,支持Json解析的第三方Json解析库还有很多,较为常用的有jsonp、json-lib和Json-smart等,感兴趣的读者可以自行研究学习。

1
1
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android中解析Json——Jackson使用

面是一个大神关于几个常见的Json数据的解析速度的测试结果,原文请戳http://wangym.iteye.com/blog/738933          我们从上图可以看出,在大数据量的情...
  • yan8024
  • yan8024
  • 2015-05-27 16:43
  • 8572

Android中解析Json——Jackson使用

面是一个大神关于几个常见的Json数据的解析速度的测试结果,原文请戳http://wangym.iteye.com/blog/738933          我们从上图可以看...
  • wuqilianga
  • wuqilianga
  • 2016-03-31 09:56
  • 644

JackSon Android Jar包

  • 2014-08-08 15:59
  • 1.07MB
  • 下载

Android开发:JSON简介及最全面解析方法(Gson、AS自带org.json、Jackson解析)

前言 今天,我们来介绍现今主流的数据交换格式-JSON! 同样作为主流为数据交换格式-XML,如果有兴趣可以阅读我写的XML及其DOM、SAX、PULL解析方法和对比 目录 JSO...
  • wmzhiloveyou
  • wmzhiloveyou
  • 2017-10-17 15:45
  • 31

Android Jackson 概述

原文地址 本文内容 JSON 的三种方式 示例 完全数据绑定(POJO)示例 “Raw”数据绑定示例 用泛型数据绑定 树模型(Tree Model)示例 流(Streaming)API 示例 流(...
  • zhuxiaoping54532
  • zhuxiaoping54532
  • 2017-03-14 14:27
  • 258

android端Jackson解析json

android端Jackson解析json
  • qq_28292937
  • qq_28292937
  • 2015-08-07 23:14
  • 558

【Android开发经验】比Gson解析速度快10倍!——Json解析神器Jackson使用介绍

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992    因为在之前的项目中,xml和json数据格式都用过,所以深深的了解在java语言的编程中,使用json...
  • bz419927089
  • bz419927089
  • 2014-11-27 18:34
  • 10652

Jackson和FastJson性能谁更快

前言jackson和fastjson大概是我们使用得最多的两个json序列化包和反序列化包。网上的性能对比很多,大多数的结果对fastjson都不利,甚至有的结论是比Gson还要慢,但是我觉得fast...
  • li563868273
  • li563868273
  • 2016-07-24 01:09
  • 5382

各个JSON技术的比较(Jackson,Gson,Fastjson)的对比

JSON技术的调研报告 一 、各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方...
  • xiaoke815
  • xiaoke815
  • 2016-10-25 11:44
  • 9299

JSON介绍及Android最全面解析方法(Gson、AS自带org.son、Jackson解析)

前言今天,我们来介绍一下现今主流的数据交换格式-JSON! 同样作为主流为数据交换格式-XML,如果有兴趣可以阅读我写的XML及其DOM、SAX、PULL解析方法和对比 目录定义JavaScrip...
  • carson_ho
  • carson_ho
  • 2016-04-03 15:30
  • 6440
    个人资料
    • 访问:254602次
    • 积分:2584
    • 等级:
    • 排名:第16307名
    • 原创:34篇
    • 转载:0篇
    • 译文:2篇
    • 评论:67条
    博客专栏
    文章分类
    最新评论