Android 中Json解析的几种框架(Gson、Jackson、FastJson、LoganSquare)使用与对比
介绍
移动互联网产品与服务器端通信的数据格式,如果没有特殊的需求的话,一般选择使用JSON格式,Android系统也原生的提供了JSON解析的API,但是它的速度很慢,而且没有提供简介方便的接口来提高开发者的效率和降低出错的可能。因此,通常情况下,我们都会选择其他优秀的JSON解析实现,用以替代系统的API,目前JSON解析的开源实现主要包括一下几种:
- Gson
- JackJson
- FastJson
- LoganSquare
例如有如下JSON数据(序列化:对象转换成字符串;反序列化:字符串转换成对象):
{
"data": {
"cities": [
{
"area": 123,
"city": "anhuisheng",
"people": 789
},
{
"area": 456,
"city": "jiangsusheng",
"people": 678
}
],
"location": "china"
},
"retcode": 200
}
结构图如下:

Gson
Gson是Google出品的Json解析函数库,可以将JSON字符串反序列化为对应的Java对象,或者反过来将Java对象序列化为对应的字符串,免去了开发者手动通过JSONObject和JSONArray将Json字段逐个进行解析的烦恼,也减少了出错的可能性,增强了代码的质量。使用gson解析时候,对应的Java实体类无需要使用注解进行标记,支持任意复杂Java对象包括没有源代码的对象。
定义json对应的类的步骤
- 先定义成员变量名称
- 再定义成员变量的类型
- 再定义泛型的类
- 从外向类逐渐推荐
步骤一 定义JSON对应的类
public class GsonData {
private Data data;
private int retcode;
@Override
public String toString() {
return "GsonData{" +
"data=" + data +
", retcode=" + retcode +
'}';
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
public int getRetcode() {
return retcode;
}
public void setRetcode(int retcode) {
this.retcode = retcode;
}
}
public class Data {
private List<City> cities;
private String location;
@Override
public String toString() {
return "Data{" +
"cities=" + cities +
", location='" + location + '\'' +
'}';
}
public List<City> getCities() {
return cities;
}
public void setCities(List<City> cities) {
this.cities = cities;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
public class City {
private int area;
private String city;
private int people;
@Override
public String toString() {
return "City{" +
"area=" + area +
", city='" + city + '\'' +
", people=" + people +
'}';
}
public int getArea() {
return area;
}
public void setArea(int area) {
this.area = area;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getPeople() {
return people;
}
public void setPeople(int people) {
this.people = people;
}
}
private GsonData getDataToGson() {
GsonData obj = new GsonData();
obj.setRetcode(200);
Data data=new Data();
City city1=new City();
city1.setArea(123);
city1.setCity("anhuisheng");
city1.setPeople(789);
City city2=new City();
city2.setArea(456);
city2.setCity("jiangsusheng");
city2.setPeople(678);
ArrayList<City> cities=new ArrayList<>();
cities.add(city1);
cities.add(city2);
data.setCities(cities);
data.setLocation("china");
obj.setData(data);
return obj;
}
步骤二 序列化与反序列化
序列化:
Gson gson = new Gson();
String json = gson.toJson(getDataToGson());
反序列化:
Gson gson=new Gson();
GsonData gsonData = gson.fromJson(JSON_STRING,GsonData.class);
Jackson
jackson是java语言的一个流行的JSON函数库,在android开发使用过程中,主要包含三部分。Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象
- jackson-core:json流处理核心库。
- jackson-databind:数据绑定函数库,实现Java对象和JSON字符串之间的相互转换。
- jackson-anntations:databind使用的注解函数库
JsonFactory:这个类是Jackson项目主要的工厂方法,主要用于配置和构建解析器(比如 JsonParser)和生成器(比如 JsonGenerator),这个工厂实例是线程安全的,如果有配置的话,可以重复使用。
JsonGenerator:这个类主要是用来生成Json格式的内容的,我们可以使用JsonFactory的方法生成一个实例。
JsonParser:这个主要是用来读取Json格式的内容,并且完成解析操作的,我们可以使用JsonFactory的方法生成一个实例。
ObjectMapper:这个类提供了Java对象和Json之间的转化,主要通过JsonParser和JsonGenerator实例来完成实际的对Json数据的读写操作。这个类是ObjectCodec的子类,主要的实现细节都在ObjectCodec里面。而且这个类可以重复使用,所以一般会创建这个类的一个单例模式,比如下面的代码
public class JacksonMapper {
private static final ObjectMapper mapper = new ObjectMapper();
private JacksonMapper() {
}
public static ObjectMapper getInstance() {
return mapper;
}
}
简单对象的Json数据生成
这里所说的简单对象指的是单一对象或者是对象的集合类
public String getJsonString(Object object) throws Exception {
return JacksonMapper.getInstance().writeValueAsString(object);
}
在这种方法中,我们直接使用ObjectMapper类的writeValueAsString(),就可以把对象的json格式作为返回值直接返回。
除此之外,我们还可以使用第二种方法,代码如下
//序列化
public String getJsonString1(Object object) throws Exception {
ObjectMapper mapper = JacksonMapper.getInstance();
StringWriter sw = new StringWriter();
JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);
mapper.writeValue(gen, object);
gen.flush();
gen.close();
return sw.toString();
}
反序列化:
GsonData gsonData = JacksonMapper.getInstance().readValue(JSON_STRING, new GsonData().getClass());
由于jackson是针对Java语言通用的JSON函数库,并没有为Android优化定制过,因此函数包中包含了很多非必需的API,相比其他JSON函数库,用于Android平台会更显著的增大最终生成的APK体积。
参考:http://blog.csdn.net/yan8024/article/details/46048807
Fastjson
fastjson是阿里巴巴公司出品的一个java语言编写的高性能且功能完善的JSON函数库,他采用一种“假定有序快速匹配”的算法,把JSON parse的性能提升到极致,号称是目前java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化,协议交互。Web输出、Android客户端等多种应用场景。
序列化:
JSON.toJSONString(getDataToGson())
反序列化:
JSON.parseObject(JSON_STRING).toString()
由于是java语言是互通的,因此,在以前的Android上使用时,Fastjson不可避免的引入了很多对于Android而言冗余的功能,从而增加了包的大小,很多人使用的就是标准版本的fastjson,但事实上,fastjson还存在一个专门为android定制的版本-fastjson-android。和标准版相比,Android版本中去掉了一些Android虚拟机dalvik不支持的功能,使得jar更小。
LoganSquare
LoganSquare是近两年崛起来的快速解析和序列化JSON的Android函数库。其底层基于jackson的streaming API,使用APT(Android Annotation Tool)实现编译时注解,从而提高JSON解析和序列化的性能。
android studio gradle配置:
对于低版本 配置:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
apt 'com.bluelinelabs:logansquare-compiler:1.3.6'
compile 'com.bluelinelabs:logansquare:1.3.6'
}
但是对于相对于较高的android studio 版本,Gradle不支持android-apt生成编译时注解的方式,所以改用下面方式:
annotationProcessor 'com.bluelinelabs:logansquare-compiler:1.3.6'
compile 'com.bluelinelabs:logansquare:1.3.6'
第一步 定义bean
@JsonObject
public class GsonData {
@JsonField
private Data data;
@JsonField
private int retcode;
@Override
public String toString() {
return "GsonData{" +
"data=" + data +
", retcode=" + retcode +
'}';
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
public int getRetcode() {
return retcode;
}
public void setRetcode(int retcode) {
this.retcode = retcode;
}
}
@JsonObject
public class Data {
@JsonField
private List<City> cities;
@JsonField
private String location;
@Override
public String toString() {
return "Data{" +
"cities=" + cities +
", location='" + location + '\'' +
'}';
}
public List<City> getCities() {
return cities;
}
public void setCities(List<City> cities) {
this.cities = cities;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
@JsonObject
public class City {
@JsonField
private int area;
@JsonField
private String city;
@JsonField
private int people;
@Override
public String toString() {
return "City{" +
"area=" + area +
", city='" + city + '\'' +
", people=" + people +
'}';
}
public int getArea() {
return area;
}
public void setArea(int area) {
this.area = area;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getPeople() {
return people;
}
public void setPeople(int people) {
this.people = people;
}
}
序列化:
LoganSquare.parse(JSON_STRING, GsonData.class).toString()
反序列化:
LoganSquare.serialize(getDataToGson()).toString()
下图是官网的一张Benchmark图,从中可以看出LonganSquare和gson、jackson databind的性能对比。

单纯从性能方面来看,LoganSquare应该是完胜gson和jackson的。如果和fastjson相比较两者应该不相伯仲的。
总结起来。四个函数库的大小分别如下:
- gson:232KB
- jackson:259+47+1229=1.5M
- Fastjson:417KB
- Fastjson.android:256KB
- LoganSquare:307KB
从性能和包的大小综合考虑我们会选择fastjson.android作为基础技术堆栈中的JSON解析和序列化库。
(PS:Android studio 通过下载插件GsonFormat 可以快速实现实体类)
Android 中Json解析的几种框架(Gson、Jackson、FastJson、LoganSquare)使用与对比的更多相关文章
- JSON解析工具比较,主要GSON和FastJSON
JSON解析工具比较,主要GSON和FastJSON 一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确 ...
- 浅谈Android项目----JSON解析(4种解析技术详解)
json简介 1.概念:json全称是javaScript object Notation,是一种并轻量级的数据交换格式. 2.特点: 1.本质就是具有特定格式的字符串 2.json完全独立于编程语言 ...
- IOS中Json解析的四种方法
作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验 ...
- 【转】IOS中Json解析的四种方法
原文网址:http://blog.csdn.net/enuola/article/details/7903632 作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有 ...
- JSON解析的几种方式
在开发中,网络请求和json解析使用的频率是一样高的,因为网络请求返回来的一般都是json(当然还有xml),这里讨论的是json,网络请求的工具类前面我的博客已经写过了,这里给出网址:http:// ...
- Android中XML解析-Dom解析
Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM.SAX以及PULL三种方式,本文就简单以D ...
- Flutter 中 JSON 解析
本文介绍一下Flutter中如何进行json数据的解析.在移动端开发中,请求服务端返回json数据并解析是一个很常见的使用场景.Android原生开发中,有GsonFormat这样的神器,一键生成Ja ...
- Android之JSON解析
做个Android网络编程的同学一定对于JSON解析一点都不陌生,因为现在我们通过手机向服务器请求资源,服务器给我们返回的数据资源一般都是以JSON格式返回,当然还有一些通过XML格式返回,相对JSO ...
- android中Json的一些应用
JSON(JavaScript Object Notation) :一种轻量级的数据交换格式,基于JavaScript的一个子集. JSON采用完全独立于语言的文本格式,使JSON成为理想的数据交换语 ...
随机推荐
- LeetCode 学习
1.整数反转 题目:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 思路:把最后的一位提取出来,放到新的容器前面,反复进行上面的操作,同时也要判断是否会导致溢出 class ...
- 帝国CMS 7.2数据导入后的参数修正
1.日期转时间戮,HTML文件名,目录名更改 update cms_ecms_jdba set newstime = UNIX_TIMESTAMP(submitTime),titleurl = CON ...
- 模块 - time/datetime
time 模块 time模块方法: >>> import time >>> time.time() #时间戳 秒级别 1519212085.6211221 #从19 ...
- Android自定义属性:attr.xml 与 TypedArray
1.attr.xml <?xml version="1.0" encoding="utf-8"?> <resources> <de ...
- DL for objection detection
在计算机视觉领域,"目标检测"主要解决两个问题:图像上多个目标物在哪里(位置),是什么(类别).围绕这个问题,人们一般把其发展历程分为3个阶段:1. 传统的目标检测方法2. 以R- ...
- Linux学习笔记—文件与文件系统的压缩与打包(转载)
压缩文件的用途与技术 例如,计算机都是以byte单位来计量的,1byte占8bit.如果存储数字1,那么1byte就会空出7bit.采用一定的计算方式,压缩这些空间可以大大降低文件存储. Linux系 ...
- n个数里选出m个不重复的数
void change(int *p,int a,int b) { int tmp = *(p + a); *(p + a) = *(p + b); *(p + b) = tmp; } int mai ...
- 阿里云上Docker Compose部署wordpress
先上官方文档: https://docs.docker.com/compose/wordpress/ 我的环境: [root@xyjk1002 ~]# cat /etc/redhat-release ...
- beego——获取参数
1.获取参数 我们经常需要获取用户传递的数据,包括Get.POST等方式的请求,beego里面会自动解析这些数据,你可以通过如下方式获取数据: GetString(key string) string ...
- Python(调用函数、定义函数)
函数的返回值: return 值:只能返回一次,只要执行return函数就终止 返回值:没有类型限制,也没有个数限制 没有return:None 返回一个值 返回多个值:元组 先定义,后使用,定义阶段 ...