fastjson和gson是目前比较经常使用的json解析库,而且如今咱们项目代码中,也在使用这两个解析库。html
fastjson 是由阿里开发的,号称是处理json效率最高的框架。而gson 是由google开发的,是功能比较全面的json解析工具。java
下面根据体积、性能、调用方式、文档完备程度等几个方面,来比较一下这两个库。android
都使用当前最新版本的jar包,fastjson-1.1.56.android.jar 为209.7kb,gson-2.8.0.jar 为232kb。git
二者体积相差不大,都很小。github
由于fastjson号称是效率最高的框架,这部分网上有不少人讨论,看了一些关于性能比较的帖子json
本身也写了简单的程序,使用最新版本的两个库测试。bash
测试方法为定义一个简单的类 Example,并生成List<Example> 实例,分别使用两个类库执行 object => string 和 string => object 操做 10 次,计算消耗时间(毫秒)。
100 | 641 | 551 | 1.16 |
200 | 1191 | 970 | 1.23 |
300 | 1786 | 1445 | 1.235 |
400 | 2393 | 1911 | 1.25 |
500 | 3038 | 2550 | 1.19 |
1000 | 6054 | 5062 | 1.195 |
2000 | 12647 | 11044 | 1.145 |
3000 | 22488 | 17923 | 1.25 |
4000 | 30385 | 24178 | 1.26 |
考虑到移动端的实际使用场景,没有继续再测试更大数据量的耗时,上述时间也与设备性能和数据结构的复杂性有关。根据上述数据来看,确实fastjson比gson快了20%左右。
只比较最简单的由object=>string 和 string=>object 的操做,二者都很是简便
相对来讲,fastjson的文档不多,从github上,能找到一篇 简单的示例代码 和一篇 常见问题解答 。没有比较全面的使用指南。
而gson的文档就丰富的多了,包括 api , 使用指南 , 以及第三方写的使用指南的连接 Gson Tutorial , Gson Tutorial Series 等。
gson远比fastjson流行,使用的人群更多。不管是在google上搜索fastjson/gson关键词,仍是在stackoverflow上搜索二者相关的提问,二者都存在数量级上的差距。
经过二者比较,虽然在性能上fastjson比gson更优,但在咱们具体的业务场景下,通常只会涉及到小数据量的解析操做,gson并不会比fastjson额外耗费太多的解析时间。
另外,从文档完备程度和解析库的流行程度来讲,gson文档相对更完善,对开发人员比较友好。另外更普遍的使用人群,也方便开发人员更容易解决或规避使用中会出现的问题。
再有,我的感受fastjson的一些特性相对gson来讲,并非太好,好比 对全部的getter方法对应的属性,都作处理 , 忽略大小写 。 以及在编写demo时感受,fastjson相对gson来讲,对代码有更多要求,相对来讲感受gson更傻瓜一些。
当前使用gson的最新版源码,版本为2.8.0,根据 CHANGELOG 中描述,在2.5版本时,将最小支持JDK版本升为 1.6。
代码路径:http://athena.devops.letv.com/#/admin/projects/ui/apps/LeGson
jar包:LeGson-v1.0.0.jar
gson github:https://github.com/google/gson
增长了 LeGson 类,对 gson 作了简单的封装
目前 LeGson 封装了下面方法,后续若是有须要会继续添加。
toJson
封装 gson 方法
public
String toJson(Object src)
|
调用示例
String str = LeGson.toJson(user);
|
封装 gson 方法
public
<T> T fromJson(String json, Type typeOfT)
|
调用示例
String jsonArray =
"[\"test1\",\"test2\",\"test3\"]"
;
List<String> stringList = LeGson.fromJson(jsonArray,
new
TypeToken<List<String>>() {}.getType());
|
封装 gson 方法
public
<T> T fromJson(String json, Class<T> classOfT)
|
调用示例
User user = LeGson.fromJson(str, User.
class
);
|
咱们会将编好的gson jar包放在项目 /vendor/letv/frameworks/base/3rd_jars 目录下,可经过以下方式引用
LOCAL_JAVA_LIBRARIES := gsonjar
|
在AndroidManifest.xml文件中添加
AndroidManifest.xml
<
application
android:name
=
"xxx"
android:icon
=
"@drawable/ic_app"
android:label
=
"@string/app_name"
android:theme
=
"@style/Feedback.Theme.Holo.Letv"
>
<
uses-library
android:name
=
"gsonjar"
/>
<
activity
android:name
=
".Activity"
android:theme
=
"@style/Feedback.Theme.Holo.Letv"
/>
|
gson提供了 fromJson() 和 toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。
Gson gson =
new
Gson();
String jsonNumber = gson.toJson(
100
);
// 100
String jsonBoolean = gson.toJson(
false
);
// false
String jsonString = gson.toJson(
"String"
);
// "String"
|
public
class
User {
public
int
id;
public
String name;
}
|
生成Json:
Gson gson =
new
Gson();
User user =
new
User(
123
,
"test-name"
);
String jsonStr = gson.toJson(user);
|
解析Json:
Gson gson =
new
Gson();
String str =
"{\"name\":\"test_name\", \"id\":234}"
;
User user = gson.fromJson(str, User.
class
);
|
当指望的json格式为
{
"name"
:
"test_name"
,
"id"
:234}
|
而实际的格式为
{
"user_name"
:
"test_name"
,
"user_id"
:234}
|
可对 User 类中相关属性添加@serializedName注解
public
class
User {
@SerializedName
(
"user_id"
)
public
int
id;
@SerializedName
(
"user_name"
)
public
String name;
}
|
这样的话,能够在保留先后端命名习惯的前提下完成数据解析。
若是要兼容多种不一样的命名方式,好比:
{
"user_name"
:
"test_name"
,
"user_id"
:234}
{
"custom_name"
:
"test_name"
,
"custom_id"
:234}
{
"student_name"
:
"test_name"
,
"student_id"
:234}
|
可以使用@SerializedName注解的 alternate 属性,传入数组参数
@SerializedName
(value =
"user_id"
, alternate = {
"student_id"
,
"custom_id"
})
public
int
id;
|
当指定的三个属性中任意一个出现时,均可以获得正确的结果。
当多种状况同时出现时,保留最后一个出现的值
String str =
"{\"student_name\":\"test_name\", \"custom_id\":234, \"user_name\":\"user-name\"}"
;
User tmp = gson.fromJson(str, User.
class
);
// name = "user-name"
|
String str =
"[\"test-1\",\"test-2\",\"test-3\",\"test-4\",\"test-5\"]"
;
String[] strs = gson.fromJson(str, String[].
class
);
List<String> strList = gson.fromJson(str,
new
TypeToken<List<String>>() {}.getType());
|
或使用上面定义的User类型为例:
List<User> userList = gson.fromJson(jsonstr,
new
TypeToken<List<User>>() {}.getType());
|
上面只是列出了gson比较基本的功能,其实gson对于json的解析处理是很是的灵活的,你们可查看更多gson的使用方式,来适应实际工做中的各类解析场景。
下面列出一些介绍的文章: