常用json解析库比较及选择 fastjson & gson

一、常用json解析库比较及选择

1.简介

fastjsongson是目前比较常用的json解析库,并且现在我们项目代码中,也在使用这两个解析库。

fastjson 是由阿里开发的,号称是处理json效率最高的框架。而gson 是由google开发的,是功能比较全面的json解析工具。

2.比较

下面根据体积、性能、调用方式、文档完备程度等几个方面,来比较一下这两个库。

2.1 包体积

都使用当前最新版本的jar包,fastjson-1.1.56.android.jar 为209.7kb,gson-2.8.0.jar 为232kb。

两者体积相差不大,都很小。

2.2 性能

因为fastjson号称是效率最高的框架,这部分网上有很多人讨论,看了一些关于性能比较的帖子

Gson、FastJson、org.JSON到底哪一个效率更高,速度更快

FastJSON、Gson和Jackson性能对比

Android总结之json解析(FastJson Gson 对比)

自己也写了简单的程序,使用最新版本的两个库测试。

测试方法为定义一个简单的类 Example,并生成List<Example> 实例,分别使用两个类库执行 object => string 和 string => object 操作 10 次,计算消耗时间(毫秒)。

1006415511.16
20011919701.23
300178614451.235
400239319111.25
500303825501.19
1000605450621.195
200012647110441.145
300022488179231.25
400030385241781.26

考虑到移动端的实际使用场景,没有继续再测试更大数据量的耗时,上述时间也与设备性能和数据结构的复杂性有关。根据上述数据来看,确实fastjson比gson快了20%左右。

2.3 调用方式

只比较最简单的由object=>string 和 string=>object 的操作,两者都非常简便

2.4 文档完备程度

相对来说,fastjson的文档很少,从github上,能找到一篇 简单的示例代码 和一篇 常见问题解答 。没有比较全面的使用指南。

而gson的文档就丰富的多了,包括 api , 使用指南 , 以及第三方写的使用指南的链接 Gson Tutorial , Gson Tutorial Series 等。

2.5 流行程度

gson远比fastjson流行,使用的人群更多。无论是在google上搜索fastjson/gson关键词,还是在stackoverflow上搜索两者相关的提问,两者都存在数量级上的差距。

3.结论

通过两者比较,虽然在性能上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 做了简单的封装

  • 使用单例的方式保存了一个 gson 对象,省去了调用方创建 gson 对象的操作。
  • catch 住调用 gson 时可能产生的json解析异常,以 warn log 的形式打印出来, TAG 为 LeGson,并返回 null 

目前 LeGson 封装了下面方法,后续如果有需要会继续添加。

 

toJson

封装 gson 方法 

 

public String toJson(Object src)

 

 

调用示例 

 

 

String str = LeGson.toJson(user);

 

 
fromJson

封装 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 目录下,可通过如下方式引用

Android.mk文件中添加

Android.mk

 

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" />

 

 

三、调用示例

1. 基本用法

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"

 

 

POJO类的生成与解析
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 );

 

2.属性重命名 @SerializedName 注解的使用

当期望的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"

 

3.解析成数组或列表 

 

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());

 

4. 更多详细功能介绍

上面只是列出了gson比较基本的功能,其实gson对于json的解析处理是非常的灵活的,大家可查看更多gson的使用方式,来适应实际工作中的各种解析场景。 

下面列出一些介绍的文章:

    Gson User Guide

    Java Google Json (Gson) Introduction

    你真的会用Gson吗?Gson使用指南(一)(二) (三) (四) 

转载于:https://www.cnblogs.com/wangqiang9/p/9909441.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值