今天跟大家分享一下關於Android中常用的JSON解析的第三方庫的使用,在我們平時的開發中,如果根據JSON數據的格式一步一步的手動去解析,不僅工作量較大而且效率也比較低,所以我們很多時候都是去採用一些第三方的庫,這裏面封裝好了各種方法供我們使用,比較常用的是GSON和Fast-json。
首先我們來看一下什麼是JSON?
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,用於數據的轉換傳輸,通用於PHP,Java,C++,C#,Python等編程語言的數據交換傳輸。容易閱讀和編寫,對於機器也很容易解析和生成,基本結構就是對象(JSONObject)和數組(JSONArray);
其次我們再來了解一下GSON:GSON是Google官方提供的用來在Java對象和JSON數據之間進行映射的Java類庫,可以講一個JSON字符串轉換成一個Java對象,也可以反過來講一個Java對象轉換成一個JSON字符串。特點是快速高效,代碼簡潔,面向對象,數據傳遞和解析方便。
最後來了解一下Fast-json:Fast-json是阿里巴巴集團研發的一個性能很好的由Java語言實現的JSON解析器和生成器,具有極快的性能(據說是全球最快的),特點是快速(比其它任何基於Java的解析器和生成器更快,包括jackson),功能強大(支持普通JDK類包括任意JavaBeanClass、Collection、Map、Date或enum),零依賴(除了JDK之外,沒有依賴任何其它類庫),支持註解、支持全類型序列化。
好了,瞭解了以上這些知識點之後,我們一起來看一下它們的具體使用方法,這裏我是根據網上的一個視頻裏面的教程做的一個案例,裏面用到的接口是豆瓣上的(接口地址貼在這裏:https://api.douban.com/v2/book/1220562),相關的jar包大家可以自己去網上下載,然後給自己的項目中添加一下依賴就OK了,接口返回的json格式的數據如下:
{
"rating": {
"max": 10,
"numRaters": 356,
"average": "7.0",
"min": 0
},
"subtitle": "",
"author": [
"[日] 片山恭一"
],
"pubdate": "2005-1",
"tags": [
{
"count": 141,
"name": "片山恭一",
"title": "片山恭一"
},
{
"count": 67,
"name": "日本",
"title": "日本"
},
{
"count": 64,
"name": "日本文學",
"title": "日本文學"
},
{
"count": 39,
"name": "小說",
"title": "小說"
},
{
"count": 33,
"name": "滿月之夜白鯨現",
"title": "滿月之夜白鯨現"
},
{
"count": 15,
"name": "愛情",
"title": "愛情"
},
{
"count": 9,
"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元"
}
在這裏我們只取其中的幾個字段做說明即可,在我們的項目中創建相關的實體類,首先創建一個Tag.java,這裏取的是接口裏面的"tags"這個字段,代碼如下:
package com.jarchie.jsonparserproject.bean;
/**
* Created by Jarchie on 17/1/4.
* 創建tags字段的實體
*/
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;
}
}
然後再來創建一個Book.java的實體類,因爲用法都一樣,所以在這裏只取接口裏的4個字段做個簡單說明:
package com.jarchie.jsonparserproject.bean;
import java.util.ArrayList;
/**
* Created by Jarchie on 17/1/4.
* 創建Book的實體
*/
public class Book {
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;
}
}
好了實體類創建完了之後,開始到項目中具體的去解析數據吧。
(一)、Gson用法:1.定義實體類;2.根據需要可以將JSON生成單個實體或列表實體集合
第一步操作,已經完成了,直接來看第二步操作,如果我們將Json生成單個實體,我們需要這樣寫:
Gson gson = new Gson();
Book book = gson.fromJson(responseString,Book.class);
這裏的responseString就是我們根據接口從網絡上獲取到的json格式的字符串。如果我們需要生成實體集合,我們可以這樣寫:
Type listType = new TypeToken<ArrayList<Book>>(){}.getType();
ArrayList<Book> books = gson.fromJson(responseString,listType);
這裏給出具體實現的源碼:
package com.jarchie.jsonparserproject;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.jarchie.jsonparserproject.bean.Book;
import java.lang.reflect.Type;
import java.util.ArrayList;
/**
* @author Jarchie
* @version 2017/01/04
* 創建Gson解析的案例
*/
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private String url = "https://api.douban.com/v2/book/1220562";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getData();
}
/**
* 採用Google提供的Volley這個網絡框架進行網絡數據的請求
*/
private void getData() {
StringRequest request = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String responseString) {
Log.i(TAG, "onResponse: " + responseString);
parserData(responseString);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
new Volley().newRequestQueue(getApplicationContext()).add(request);
}
/**
* Gson解析的具體使用
* @param responseString
*/
private void parserData(String responseString) {
Gson gson = new Gson();
Book book = gson.fromJson(responseString,Book.class);
Log.e(TAG, "parserData: " + book.getTitle() + ":" +
book.getPublisher() + ":" + book.getTags().size());
// Type listType = new TypeToken<ArrayList<Book>>(){}.getType();
// ArrayList<Book> books = gson.fromJson(responseString,listType);
}
}
(二)、Fast-json用法:1.定義實體類;2.根據需要可以將JSON生成單個實體或列表實體集合
同樣的第一步已經完成了,直接來看第二步操作,將json生成單個實體,我們可以這樣寫:
Book book = JSON.parseObject(responseString,Book.class);
大家看,一句話就搞定了,是不是比我們用原生的解析方便多了。如果我們要將json轉成實體集合,我們可以這樣寫:
List<Book> list = JSON.parseObject(responseString,new TypeReference<List<Book>>(){});
這裏我們還可以反向操作,如果我們想要將實體轉成JSON數據,我們可以這樣寫:
Book book1 = new Book();
book1.setTitle("測試1");
JSON.toJSON(book1);
我們想要將集合轉成JSON數據,我們可以這樣寫:
List<Book> lists = new ArrayList<>();
lists.add(book1);
JSON.toJSON(lists);
這裏給出源碼,供大家參考:
package com.jarchie.jsonparserproject;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.jarchie.jsonparserproject.bean.Book;
import java.util.ArrayList;
import java.util.List;
/**
* @author Jarchie
* @version 2017/01/04
* 創建fast-json的案例
*/
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private String url = "https://api.douban.com/v2/book/1220562";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getData();
}
/**
* 網絡獲取數據
*/
private void getData() {
StringRequest request = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String responseString) {
Log.i(TAG, "onResponse: " + responseString);
parserData(responseString);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
Volley.newRequestQueue(getApplicationContext()).add(request);
}
/**
* 解析數據
* @param responseString
*/
private void parserData(String responseString) {
Book book = JSON.parseObject(responseString,Book.class);
Log.e(TAG, "parserData: " + book.getTitle() + ":"
+book.getPublisher()+":"+book.getTags().size());
// List<Book> list = JSON.parseObject(responseString,new TypeReference<List<Book>>(){});
//
// Book book1 = new Book();
// book1.setTitle("測試1");
// JSON.toJSON(book1);
//
// List<Book> lists = new ArrayList<>();
// lists.add(book1);
// JSON.toJSON(lists);
}
}
因爲現在我們大家都使用AndroidStudio進行開發了,在AS裏面有一個非常優秀的插件可以讓我們快速生成實體類,我們只需要定義好一個類即可,裏面的內容可以爲我們自動生成,我們可以自行的去AS中搜索下載。
使用的時候我們只要在Bean類裏面右鍵-->Generate-->GsonFormat,然後將json數據放進去,回車後選擇自己需要的字段即可自動生成,非常方便。
好了,今天就分享這麼多,謝謝大家!