目前Android在使用的Json解析框架主要有Jackson、Gson、FastJson、org.json;
因为Android Studio自带的org.json解析 XML 文件时会将整个 XML 文件的内容解析成树型结构存放在内存中并创建新对象,比较消耗时间和内存,解析速度和效率慢,解析方式和性能完败Gson等开源框架,导致org.json慢慢的也在被淘汰,Andorid开发中还在使用org.json的已经很少,所以我们今天暂时不讨论org.json。
OK,接下来我们来一起简单了解下这3个框架:
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());
}
}
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是阿里巴巴公司提供的一个用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);
ok,上面介绍了Jackson、Gson、FastJson的基本内容,细心的朋友可能发现介绍Gson与FastJson时我并未提及他们的缺点,这里说一下,并不是说这2个框架没有缺点,只是相对与其他的框架他们的缺点并不突出。
上面特别介绍了Jackson的缺点,以及推荐了它使用的场景,那么其他场景下还是不建议大家使用,这点对于开发者来说其实也是需要考虑的一个问题,如果该库的API使用难度大,或者很复杂,那么不建议使用,毕竟JSON解析的性能差异并不大。
那么接下来我们来看看它们的序列化性能、反序列化性能、jar大小
FastJson:1201
Jackson: 1408
Gson : 7421
FastJson:1216
Jackson: 1915
Gson : 5065
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等,感兴趣的读者可以自行研究学习。