JSONObject 和 GSON 解析 JSON 數據詳解(轉)


轉載: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 這兩種數據格式最常用的幾種解析方法都學習完了,在網絡數據的解析方面,我們已經成功畢業了。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM