常用json解析库比较及选择 fastjson & gson
一、常用json解析库比较及选择
1.简介
fastjson和gson是目前比较常用的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号称是效率最高的框架,这部分网上有很多人讨论,看了一些关于性能比较的帖子
自己也写了简单的程序,使用最新版本的两个库测试。
测试方法为定义一个简单的类 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%左右。
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文件中添加
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); // 100String jsonBoolean = gson.toJson(false); // falseString 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的使用方式,来适应实际工作中的各种解析场景。
下面列出一些介绍的文章:
Java Google Json (Gson) Introduction
你真的会用Gson吗?Gson使用指南(一)(二)(三)(四)
常用json解析库比较及选择 fastjson & gson的更多相关文章
- fastjson是阿里巴巴的开源JSON解析库
fastjson的API十分简洁. String text = JSON.toJSONString(obj); //序列化 VO vo = JSON.parseObject("{...}&q ...
- Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例
Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的 ...
- 深入 Go 中各个高性能 JSON 解析库
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/535 其实本来我是没打算去看 JSON 库的性能问题的,但是最近我对 ...
- Tomjson - 一个"短小精悍"的 json 解析库
Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...
- Tomjson - json 解析库
Tomjson - 一个"短小精悍"的 json 解析库 Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把 ...
- java后台常用json解析工具问题小结
若排版紊乱可查看我的个人博客原文地址 java后台常用json解析工具问题小结 这里不细究造成这些问题的底层原因,只是单纯的描述我碰到的问题及对应的解决方法 jackson将java对象转json字符 ...
- python 中的json解析库
当一个json 数据很大的时候.load起来是很耗时的.python中常见的json解析库有cjson,simplesjson,json, 初步比较了一下, 对于loads来讲 simplejson ...
- C++的Json解析库:jsoncpp和boost
C++的Json解析库:jsoncpp和boost - hzyong_c的专栏 - 博客频道 - CSDN.NET C++的Json解析库:jsoncpp和boost 分类: 网络编程 开源库 201 ...
- C++的Json解析库:jsoncpp和boost(转)
原文转自 http://blog.csdn.net/hzyong_c/article/details/7163589 JSON(JavaScript Object Notation)跟xml一样也是一 ...
随机推荐
- java及jdbc与sql之间日期的转换
javaSE中主要为日期字符串和日期对象之间的转换 JDBC中主要是util中Date与sql中作为数据库中Date的转换 public class DateDemo { public static ...
- 毕设三: spark与phoenix集成插入数据/解析json数组
需求:将前些日子采集的评论存储到hbase中 思路: 先用fastjson解析评论,然后构造rdd,最后使用spark与phoenix交互,把数据存储到hbase中 部分数据: [ { "r ...
- fusionchart实现ZoomLine 资源 破解版 出口能力
最近的曲线需要用油画ZoomLine官方网站看了好几天,今天整理出来供大家参考使用 zoomline.html资源 <!DOCTYPE HTML PUBLIC "-//W3C//DTD ...
- Cordova之如何用命令行创建一个项目(完整示例)
原文:Cordova之如何用命令行创建一个项目(完整示例) 1. 创建cordova项目 (注意:当第一次创建或编译项目的时候,可能系统会自动下载一些东西,需要一些时间.) 在某个目录下创建cordo ...
- MapReduce wordcount 输入路径为目录 java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$POSIX.stat(Ljava/lang/String;)Lorg/apache/hadoop/io/nativeio/NativeIO$POSIX$Stat;
之前windows下执行wordcount都正常,今天执行的时候指定的输入路径是文件夹,然后就报了如题的错误,把输入路径改成文件后是正常的,也就是说目前的wordcount无法对多个文件操作 报的异常 ...
- 超级简单的9patch
转载请声明出处:http://blog.csdn.net/dawanganban 我们在有些应用中会用到将图片内部指定区域撑大的效果,如微信中的消息内容背景,这时候就要用到9patch图片,效果如下: ...
- jsonkit 分解nsarray 时刻 一个错误
jsonkit 分解nsarray 时刻 一个错误 Assertion failure in -[TXJKArray count], /Users/mqq/hudson/1740/src/Tencen ...
- 详解第一个CUDA程序kernel.cu
CUDA是一个基于NVIDIA GPU的并行计算平台和编程模型,通过调用CUDA提供的API,可以开发高性能的并行程序.CUDA安装好之后,会自动配置好VS编译环境,按照UCDA模板新建一个工程&qu ...
- "Redis客户端连接数一直降不下来"的有关问题解决 good
[线上问题] "Redis客户端连接数一直降不下来"的问题解决 前段时间,上线了新的 Redis缓存(Cache)服务,准备替换掉 Memcached. 为什么要将 Memcach ...
- 距离北京奥运还有359天,发布WPF版本的北京2008标志(下)
原文:距离北京奥运还有359天,发布WPF版本的北京2008标志(下) 图片显示效果: XAML代码: <Viewbox Width="463.548828" Height ...