一、常用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 次,计算消耗时间(毫秒)。

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文件中添加

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使用指南(一)(二)(三)(四)

常用json解析库比较及选择 fastjson & gson的更多相关文章

  1. fastjson是阿里巴巴的开源JSON解析库

    fastjson的API十分简洁. String text = JSON.toJSONString(obj); //序列化 VO vo = JSON.parseObject("{...}&q ...

  2. Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

    Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的 ...

  3. 深入 Go 中各个高性能 JSON 解析库

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/535 其实本来我是没打算去看 JSON 库的性能问题的,但是最近我对 ...

  4. Tomjson - 一个"短小精悍"的 json 解析库

    Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...

  5. Tomjson - json 解析库

    Tomjson - 一个"短小精悍"的 json 解析库 Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把 ...

  6. java后台常用json解析工具问题小结

    若排版紊乱可查看我的个人博客原文地址 java后台常用json解析工具问题小结 这里不细究造成这些问题的底层原因,只是单纯的描述我碰到的问题及对应的解决方法 jackson将java对象转json字符 ...

  7. python 中的json解析库

    当一个json 数据很大的时候.load起来是很耗时的.python中常见的json解析库有cjson,simplesjson,json, 初步比较了一下, 对于loads来讲 simplejson ...

  8. C++的Json解析库:jsoncpp和boost

    C++的Json解析库:jsoncpp和boost - hzyong_c的专栏 - 博客频道 - CSDN.NET C++的Json解析库:jsoncpp和boost 分类: 网络编程 开源库 201 ...

  9. C++的Json解析库:jsoncpp和boost(转)

    原文转自 http://blog.csdn.net/hzyong_c/article/details/7163589 JSON(JavaScript Object Notation)跟xml一样也是一 ...

随机推荐

  1. 【codeforces 768C】Jon Snow and his Favourite Number

    [题目链接]:http://codeforces.com/contest/768/problem/C [题意] 给你n个数字; 让你每次把这n个数字排序; 然后对奇数位的数字进行异或操作,然后对新生成 ...

  2. javaScript判断输入框是否为空

    其中获得和失去焦点的时候都判断了一次 <script> function fun01(f,s){//有参函数 参数不需要参数类型!! try{ var v = document.getEl ...

  3. Java设计模式菜鸟系列(二十二)中介者模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40027109 中介者模式(Mediator):主要用来减少类与类之间的耦合的,由于假设类与 ...

  4. Java泛型详解:<T>和Class<T>的使用。泛型类,泛型方法的详细使用实例

    一.引入 1.泛型是什么 首先告诉大家ArrayList就是泛型.那ArrayList能完成哪些想不到的功能呢?先看看下面这段代码: [java] view plain copy ArrayList& ...

  5. jQuery Mobile移动开发

    1.在<head>元素中包括JavaScript文件是传统的方法.然而,依据Yahoo!"80%的终于用户响应时间在前端上"的说法,这些事件大部分花在资产的下载上,比如 ...

  6. 用js获取实时的获取当前的年月日,时分秒,以及星期

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  7. 使用哈希加盐法来为密码加密(补充JAVA的实现)

    使用哈希加盐法来为密码加密 转自:http://www.cnblogs.com/jfzhu/p/4023439.html 转载请注明出处   (一)为什么要用哈希函数来加密密码 如果你需要保存密码(比 ...

  8. java中 8进制 10进制 2进制 16进制 相互转换

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  9. sqlplus登录信息,列出所有表,列在表结构,sqlplus行和列显示设置,别名,Null值问题,细木工,DISTINCT

     1 sqlplus登录方式: 普通用户登录: 登录eg:C:\>sqlplusscott/11  (格式:sqlplus username/password) 退出eg:quit退出 超级 ...

  10. 简明Python3教程 9.函数

    简介 函数是程序的可复用片段,允许你为语句块赋予名字之后在程序的任何地方运行它们任意次,这称做函数调用. 我们已经使用过一些内建函数,例如len和range等. 函数也许是任何有意义的软件中最重要的构 ...