Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例
Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例
继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的好用,今天我们为了博客的保质保量,也就不分开写,我们直接拿比较火的Gson和Fast-json来使用,末尾在进行一些分析
一.各有千秋
两大解析库的东家都是巨头,一个来自于Google官方,一个来自阿里巴巴,我们这里对他做一个简单的介绍(大多数来源于网络)
Gson
Google提供的用来java对象和JSON数据之间进行映射的JAVA类库,可以将一个JSON字符转成一个java对象,或者反过来
来看看他的优点
- 快速,高效
- 代码量少
- 面向对象
- 数据传输解析方便
Fast-json
FastJson是一个性能很好的java语言实现的Json解析器和生成器,来自阿里巴巴的工程师,具有极快的性能,超越其他的java json parser,而阿里的工程师程,fastjson是闲着全球最快的解析库
优点
- 快速FAST(比任何一款都快)
- 面向对象
- 功能强大(支持普通JDK类任意java bean Class,Collection,Map,Date或者enum)
- 零依赖(只需要有JDK即可)
- 支持注解,全类型序列化
二.Gson的使用
Gson的使用,我们直接定义一个实体类然后进行转换
这里我们使用到的就是Gson和Volley,所以我们需要下载好这两个架包,对了,别忘了权限
<uses-permission android:name="android.permission.INTERNET"/>
这里我们用到的接口是豆瓣的接口
{
"rating": {
"max": 10,
"numRaters": 351,
"average": "7.0",
"min": 0
},
"subtitle": "",
"author": [
"[日] 片山恭一"
],
"pubdate": "2005-1",
"tags": [
{
"count": 139,
"name": "片山恭一",
"title": "片山恭一"
},
{
"count": 66,
"name": "日本",
"title": "日本"
},
{
"count": 62,
"name": "日本文学",
"title": "日本文学"
},
{
"count": 38,
"name": "小说",
"title": "小说"
},
{
"count": 32,
"name": "满月之夜白鲸现",
"title": "满月之夜白鲸现"
},
{
"count": 15,
"name": "爱情",
"title": "爱情"
},
{
"count": 8,
"name": "純愛",
"title": "純愛"
},
{
"count": 7,
"name": "外国文学",
"title": "外国文学"
}
],
"origin_title": "",
"image": "https://img3.doubanio.com/mpic/s1747553.jpg",
"binding": "平装",
"translator": [
"豫人"
],
"catalog": "\n ",
"pages": "180",
"images": {
"small": "https://img3.doubanio.com/spic/s1747553.jpg",
"large": "https://img3.doubanio.com/lpic/s1747553.jpg",
"medium": "https://img3.doubanio.com/mpic/s1747553.jpg"
},
"alt": "https://book.douban.com/subject/1220562/",
"id": "1220562",
"publisher": "青岛出版社",
"isbn10": "7543632608",
"isbn13": "9787543632608",
"title": "满月之夜白鲸现",
"url": "https://api.douban.com/v2/book/1220562",
"alt_title": "",
"author_intro": "",
"summary": "那一年,是听莫扎特、钓鲈鱼和家庭破裂的一年。说到家庭破裂,母亲怪自己当初没有找到好男人,父亲则认为当时是被狐狸精迷住了眼,失常的是母亲,但出问题的是父亲……。",
"price": "15.00元"
}
我们分析一下这段json,实际上他很普通,就是一个数据里面一个数组,我们用Gson应该怎么去解析呢?我们先写个方法区解析这个接口得到这个Json再说吧
/**
* 解析接口
*/
private void getJson() {
StringRequest request = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Log.i("json", s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
//加入volley对列
new Volley().newRequestQueue(getApplicationContext()).add(request);
}
解析之后得到的json就是上面的那句了
OK。轮到我们的Gson上场了
我们要解析什么就写什么,所以定义一个Bean
package com.lgl.fastandgson.bean;
import java.util.ArrayList;
/**
* Gson的实体类
* Created by LGL on 2016/5/21.
*/
public class Book {
/**
* 定义的变量名要和json的键值吻合
*/
//书名
private String title;
//出版社
private String publisher;
//简介
private String summary;
//标签
private ArrayList<Tag>tags;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public ArrayList<Tag> getTags() {
return tags;
}
public void setTags(ArrayList<Tag> tags) {
this.tags = tags;
}
}
同样的,我们json里面由数组,所以需要再定义一个
package com.lgl.fastandgson.bean;
/**
* 标签的实体
* Created by LGL on 2016/5/21.
*/
public class Tag {
private String count;
private String name;
private String title;
public String getCount() {
return count;
}
public void setCount(String count) {
this.count = count;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
好了,现在我们直接解析了,一句话的事情
/**
* 解析json
*
* @param json
*/
private void Volley_json(String json) {
Gson gson = new Gson();
//将json转换成实体
Book book = gson.fromJson(json, Book.class);
tv_content.setText("书名:" + book.getTitle() + "\n"
+ "出版社:" + book.getPublisher() + "\n" + "简介:"
+ book.getSummary() + "\n" + "标签"
+ book.getTags().size() + "\n");
}
我们直接看运行点击结果
这里要注意几点
- 1、内部嵌套的类必须是static的,要不然解析会出错;
- 2、类里面的属性名必须跟Json字段里面的Key是一模一样的;
- 3、内部嵌套的用[]括起来的部分是一个List,所以定义为 public List< B> b,而只用{}嵌套的就定义为 public C c,
是不是很简单,而且现在android studio上可以直接用插件生成实体类,那更加方便了
三.Fast-Json
OK,感受了Gson的强大之后,我们再来看看fastjson的奇妙之处吧;
我们需要下载架包,网上一大堆哈
前面都一样,定义两个实体类,使用Volley解析,我们重点来看一下Volley_json这个方法,这两个的用法也很像
/**
* 解析json
*
* @param json
*/
private void Volley_json(String json) {
//解析
Book book = JSON.parseObject(json,Book.class);
tv_content.setText("书名:" + book.getTitle() + "\n"
+ "出版社:" + book.getPublisher() + "\n" + "简介:"
+ book.getSummary() + "\n" + "标签"
+ book.getTags().size() + "\n");
}
只需这样,就可以解析了
但是你会说,这些都这么简单,的确,架包就是用来方便开发的,我们用一个小案例来总结这两个jar吧
四.图书列表
现在的接口,从哪里来呢,一直看博客的朋友应该知道,我喜欢去聚合数据找免费的api做演示,所以今天使用到的接口也是
APPKEY:eab1de650b181e91da30526a3e59541b
接口:http://apis.juhe.cn/goodbook/catalog?key=eab1de650b181e91da30526a3e59541b&dtype=json
得到的json
{
"resultcode": "200",
"reason": "success",
"result": [
{
"id": "242",
"catalog": "中国文学"
},
{
"id": "252",
"catalog": "人物传记"
},
{
"id": "244",
"catalog": "儿童文学"
},
{
"id": "248",
"catalog": "历史"
},
{
"id": "257",
"catalog": "哲学"
},
{
"id": "243",
"catalog": "外国文学"
},
{
"id": "247",
"catalog": "小说"
},
{
"id": "251",
"catalog": "心灵鸡汤"
},
{
"id": "253",
"catalog": "心理学"
},
{
"id": "250",
"catalog": "成功励志"
},
{
"id": "249",
"catalog": "教育"
},
{
"id": "245",
"catalog": "散文"
},
{
"id": "256",
"catalog": "理财"
},
{
"id": "254",
"catalog": "管理"
},
{
"id": "246",
"catalog": "经典名著"
},
{
"id": "255",
"catalog": "经济"
},
{
"id": "258",
"catalog": "计算机"
}
],
"error_code": 0
}
貌似比较简单,里面就一个数组
我们按部就班,先用volley把json解析出来
/**
* 解析接口
*/
private void getJson() {
StringRequest request = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Log.i("json", s);
try {
Volley_json(s);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
//加入volley对列
new Volley().newRequestQueue(getApplicationContext()).add(request);
}
接着我们准备显示的layout,就是一个ListView,然后我们的item也就是一个TextView,这样的话,我们可以直接写实体类了
package com.lgl.fastandgson.bean;
/**
* 图书列表实体类
* Created by LGL on 2016/5/21.
*/
public class BookListBean {
//ID
private String id;
//类型
private String catalog;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCatalog() {
return catalog;
}
public void setCatalog(String catalog) {
this.catalog = catalog;
}
}
以及列表的适配器
package com.lgl.fastandgson.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.lgl.fastandgson.R;
import com.lgl.fastandgson.bean.BookListBean;
import java.util.List;
/**
* 图书列表适配器
* Created by LGL on 2016/5/21.
*/
public class BookListAdapter extends BaseAdapter {
private Context mContext;
private List<BookListBean> mList;
private LayoutInflater mInflater;
//构造方法
public BookListAdapter(Context mContext, List<BookListBean> mList) {
this.mContext = mContext;
this.mList = mList;
mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if(convertView == null){
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.list_item,null);
viewHolder.mTextView = (TextView) convertView.findViewById(R.id.mTextView);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
BookListBean bean = mList.get(position);
viewHolder.mTextView.setText(bean.getId()+"\n"+bean.getCatalog());
return convertView;
}
class ViewHolder{
private TextView mTextView;
}
}
然后我们就可以解析数据开始填充了
/**
* 解析json
*
* @param json
*/
private void Volley_json(String json) throws JSONException {
Gson gson = new Gson();
Type listType = new TypeToken<ArrayList<BookListBean>>() {
}.getType();
JSONObject object = new JSONObject(json);
ArrayList<BookListBean> list = gson.fromJson(object.getString("result"), listType);
adapter = new BookListAdapter(this, list);
mListView.setAdapter(adapter);
}
运行的结果总所周知
到这里,本篇博客就结束了,本篇博客还是十分的基础,没有牵扯太深,只是简单的介绍和使用了一下这两个框架,我们后续可能会出一些稍微高级的博客!
有兴趣和我们一起交流撩妹的可以加群:555974449
Demo下载:http://download.csdn.net/detail/qq_26787115/9527296
Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例的更多相关文章
- python 中的json解析库
当一个json 数据很大的时候.load起来是很耗时的.python中常见的json解析库有cjson,simplesjson,json, 初步比较了一下, 对于loads来讲 simplejson ...
- 常用json解析库比较及选择 fastjson & gson
一.常用json解析库比较及选择 1.简介 fastjson和gson是目前比较常用的json解析库,并且现在我们项目代码中,也在使用这两个解析库. fastjson 是由阿里开发的,号称是处理jso ...
- 深入 Go 中各个高性能 JSON 解析库
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/535 其实本来我是没打算去看 JSON 库的性能问题的,但是最近我对 ...
- Tomjson - 一个"短小精悍"的 json 解析库
Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...
- fastjson是阿里巴巴的开源JSON解析库
fastjson的API十分简洁. String text = JSON.toJSONString(obj); //序列化 VO vo = JSON.parseObject("{...}&q ...
- Tomjson - json 解析库
Tomjson - 一个"短小精悍"的 json 解析库 Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把 ...
- 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一样也是一 ...
- [转]C++的Json解析库:jsoncpp和boost
JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...
随机推荐
- 全新 Kali Linux 系统安装指南
Kali Linux 系统可以说是在安全测试方面最好的开箱即用的 Linux 发行版.Kali 下的很多工具软件都可以安装在大多数的 Linux 发行版中,Offensive Security 团队在 ...
- Docker Kubernetes 项目
Kubernetes 是 Google 团队发起并维护的基于Docker的开源容器集群管理系统,它不仅支持常见的云平台,而且支持内部数据中心. 建于Docker之上的Kubernetes可以构建一个容 ...
- matplotlib画散点图,并在散点处打上相应标签
运行环境: py3.6 matplotlib 2.1.2 x = [2,4,6,7,8,5,4,3] y = [3,6,5,8,4,3,2,4] txt = ['我','今','晚','上','吃', ...
- RTMPdump(libRTMP)源代码分析 4: 连接第一步——握手(Hand Shake)
===================================================== RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: ...
- Android桌面小插件——Widget
Android桌面小插件--Widget 效果图 实现 1. 创建Widget类 创建一个Widget类,并实现页面创建的时候,就实现显示时间 package com.kongqw.kqwwidget ...
- Eclipse的Debug调试技巧
作为开发人员,掌握开发环境下的调试技巧十分有必要.我们在编写java程序的过程中,经常会遇到各种莫名其妙的问题,为了检测程序是哪里出现问题,经常需要增加日志,看变量的值,这样调试很麻烦.假设我每天花费 ...
- Redis集群教程(Redis cluster tutorial)
本博文翻译自Redis官网:http://redis.io/topics/cluster-tutorial 本文档以温和的方式介绍Redis集群,不使用复杂的方式来理解分布式系统的概念. ...
- Swift延迟加载的一种用途
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 有以下一种情况: 我们试图用Cocoa的语音合成类NSSpee ...
- Swift基础之设计折线坐标图
最近添加了折线视图的样式,所以在这里用Swift语言重新再使用设计一下 首先设置纵坐标的数值是:体重 //体重 let weightLabel = UILabel.init(frame: ...
- 剑指Offer——迅雷笔试题+知识点总结
剑指Offer--迅雷笔试题+知识点总结 情景回顾 时间:2016.9.19 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:迅雷笔试 总体来说,迅雷笔试内容体量不算多,主要 ...