轉載:http://www.jianshu.com/p/f99de3ec0636
點此進入:從零快速構建APP系列目錄導圖
點此進入:UI編程系列目錄導圖
點此進入:四大組件系列目錄導圖
點此進入:數據網絡和線程系列目錄導圖
本節例程下載地址:WillFLowJSON
一、JSON簡介
我們之前已經掌握了 XML 格式數據的解析方式,那么接下來我們要去學習一下如何解析 JSON 格式的數據,在學習之前,我們先將這兩者做一個簡單的比較。
XML與JSON的對比:
- JSON和XML的數據可讀性基本相同
- JSON和XML同樣擁有豐富的解析手段
- JSON相對於XML來講,數據的體積小
- JSON與JavaScript的交互更加方便
- JSON對數據的描述性比XML較差
- JSON的速度要遠遠快於XML
總之,比起 XML, JSON 的主要優勢在於它的體積更小,在網絡上傳輸的時候可以更省流量。但缺點在於,它的語義性較差,看起來不如 XML 直觀。
(1)JSON 的格式規范
就像協議一樣,JSON 也是有一套規范的,畢竟服務端和客戶端雙方一般來講都是通過 JSON 字符串來傳遞數據的。
它的語法規則如下:
- 數據在“名稱/值”對中;
- 數據由逗號分隔;
- 花括號保存對象;
- 方括號保存數組;
(2)JSON數據的書寫格式范例
[
{ "id":"1","name":"WGH","age":"18" },
{ "id":"2","name":"WillFlow","age":"16" }
]
(3)JSON校驗工具
我們除了解析JSON還可以自己拼接JSON,當然如果你自己拼了一個JSON字符串又不知道對不對, 可以用校驗工具進行校驗,比如:點擊這里,然后把自己拼接的JSON字符串貼上去,就可以校驗正確與否了。
(4)Android給我們提供的JSON解析類
這些JSON解析類的API都存在於org.json包下,而我們用到的類有下面這些:
- JSONObject: JSON對象,可以完成Json字符串與Java對象的相互轉換
- JSONArray: JSON數組,可以完成Json字符串與Java集合或對象的相互轉換
- JSONStringer: JSON文本構建類,這個類可以幫助快速和便捷的創建JSON text, 每個JSONStringer實體只能對應創建一個JSON text
- JSONTokener:JSON解析類
- JSONException:JSON異常
二、用 JSONObject 解析 JSON 格式數據
首先在MainActivity中定義一個JSON 字符串常量,代碼如下:
private static final String JSON = "[\n" +
" {\"id\":\"1\",\"version\":\"1.5\",\"name\":\"Apple\"},\n" +
" {\"id\":\"2\",\"version\":\"1.6\",\"name\":\"WillFlow\"},\n" +
" {\"id\":\"3\",\"version\":\"1.7\",\"name\":\"WGH\"}\n" +
"]";
這樣我們就把 JSON 格式的數據准備好了,下面就開始在 Android 程序中解析這些數據。
修改 MainActivity 中的代碼,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
parseJSONWithJSONObject(JSON);
}
private void parseJSONWithJSONObject(String jsonData) {
try {
JSONArray jsonArray = new JSONArray(jsonData);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String id = jsonObject.getString("id");
String name = jsonObject.getString("name");
String version = jsonObject.getString("version");
Log.i(TAG, "id : " + id);
Log.i(TAG, "name : " + name);
Log.i(TAG, "version : " + version);
Log.i(TAG, "————————————————————");
}
} catch (Exception e) {
e.printStackTrace();
}
}
可以看到,解析 JSON 的代碼真的是非常簡單,由於我們定義的是一個 JSON 數組,因此這里首先是將數據傳入到了一個 JSONArray 對象中,然后循環遍歷這個 JSONArray,從中取出的每一個元素都是一個 JSONObject 對象,每個 JSONObject 對象中又會包含 id、 name 和 version 這些數據。接下來只需要調用 getString() 方法將這些數據取出,並打印出來即可。
編譯運行查看日志數出
三、用 GSON 解析 JSON 格式數據
如何你認為使用 JSONObject 來解析 JSON 數據已經非常簡單了,那你就太容易滿足了。谷歌提供的 GSON 開源庫可以讓解析 JSON 數據的工作簡單到讓你不敢想象的地步,那我們肯定是不能錯過這個學習機會的。
首先,在Gradle中配置如下依賴:
dependencies {
......
compile 'com.google.code.gson:gson:2.8.1'
}
這時候GSON框架就加載好了,我們需要手動同步一下。
如果你的 Android Studio 中沒有安裝GSON插件的話,可以這樣安裝:
完成之后重啟 Android Studio 即可。
那么 GSON 庫究竟是神奇在哪里呢?其實它主要就是可以將一段 JSON格式的字符串自動映射成一個對象,從而不需要我們再手動去編寫代碼進行解析了,比如說一段 JSON 格式的數據如下所示:
{"name":"Tom","age":20}
那我們就可以定義一個 Person 類,並加入 name 和 age 這兩個字段,然后只需簡單地調用如下代碼就可以將 JSON 數據自動解析成一個 Person 對象了:
Gson gson = new Gson();
Person person = gson.fromJson(jsonData, Person.class);
如果需要解析的是一段 JSON 數組會稍微麻煩一點,我們需要借助 TypeToken 將期望解析成的數據類型傳入到 fromJson() 方法中,如下所示:
List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>(){}.getType());
基本的用法就是這樣,下面就讓我們來真正地嘗試一下。
這里我們首先准備好需要解析的JSON原始數據:
[
{"id":"1","version":"1.5","name":"Apple"},
{"id":"2","version":"1.6","name":"WillFlow"},
{"id":"3","version":"1.7","name":"WGH"}
]
然后新建一個AppBean類,用於數據規范的定義:
/**
* Created by : WGH.
*/
public class AppBean {
}
然后在該類的任意位置“Alt + Insert”,然后選擇“Gson Format”或者使用快捷鍵“Alt + S”
然后會出現這樣的界面,然后把我們剛才的JSON原始數據粘貼進去后點擊OK:
繼續點擊OK,你會發現此時的AppBean變成了這個樣子:
/**
* Created by : WGH.
*/
public class AppBean {
/**
* id : 1
* version : 1.5
* name : Apple
*/
private String id;
private String version;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
這是一個包含了id、 name 和 version 這三個字段的數據類,並且成員變量和JSON原始數據的Key值完全相同(這點尤為重要,這是采用GSON解析的必須)。
最后在 MainAcitivyt 中定義這樣的方法:
private void parseByGSON(String jsonData) {
Gson gson = new Gson();
List<AppBean> appList = gson.fromJson(jsonData, new TypeToken<List<AppBean>>() {}.getType());
for (AppBean app : appList) {
Log.i(TAG, "id : " + app.getId());
Log.i(TAG, "name : " + app.getName());
Log.i(TAG, "version : " + app.getVersion());
Log.i(TAG, "————————————————————");
}
}
然后調用輸出即可。
編譯運行查看Log輸出
這樣我們就就把 XML 和 JSON 這兩種數據格式最常用的幾種解析方法都學習完了,在網絡數據的解析方面,我們已經成功畢業了。
