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

轉載:http://www.jianshu.com/p/f99de3ec0636
點此進入:從零快速構建APP系列目錄導圖
點此進入:UI編程系列目錄導圖
點此進入:四大組件系列目錄導圖
點此進入:數據網絡和線程系列目錄導圖
本節例程下載地址:WillFLowJSON

1、JSON簡介

咱們以前已經掌握了 XML 格式數據的解析方式,那麼接下來咱們要去學習一下如何解析 JSON 格式的數據,在學習以前,咱們先將這二者作一個簡單的比較。編程

XML與JSON的對比:
  • JSON和XML的數據可讀性基本相同
  • JSON和XML一樣擁有豐富的解析手段
  • JSON相對於XML來說,數據的體積小
  • JSON與JavaScript的交互更加方便
  • JSON對數據的描述性比XML較差
  • JSON的速度要遠遠快於XML

總之,比起 XML, JSON 的主要優點在於它的體積更小,在網絡上傳輸的時候能夠更省流量。但缺點在於,它的語義性較差,看起來不如 XML 直觀。json

(1)JSON 的格式規範

就像協議同樣,JSON 也是有一套規範的,畢竟服務端和客戶端雙方通常來說都是經過 JSON 字符串來傳遞數據的。數組

它的語法規則以下:網絡

  • 數據在「名稱/值」對中;
  • 數據由逗號分隔;
  • 花括號保存對象;
  • 方括號保存數組;
(2)JSON數據的書寫格式範例
[
    { "id":"1","name":"WGH","age":"18" },
    { "id":"2","name":"WillFlow","age":"16"  }
]
(3)JSON校驗工具

咱們除了解析JSON還能夠本身拼接JSON,固然若是你本身拼了一個JSON字符串又不知道對不對, 能夠用校驗工具進行校驗,好比:點擊這裏,而後把本身拼接的JSON字符串貼上去,就能夠校驗正確與否了。app

(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異常

2、用 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 程序中解析這些數據。ide

修改 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() 方法將這些數據取出,並打印出來便可。工具

編譯運行查看日誌數出

 

3、用 GSON 解析 JSON 格式數據

如何你認爲使用 JSONObject 來解析 JSON 數據已經很是簡單了,那你就太容易知足了。谷歌提供的 GSON 開源庫可讓解析 JSON 數據的工做簡單到讓你不敢想象的地步,那咱們確定是不能錯過這個學習機會的。學習

首先,在Gradle中配置以下依賴:
dependencies {
    ......
    compile 'com.google.code.gson:gson:2.8.1'
}

這時候GSON框架就加載好了,咱們須要手動同步一下。this

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

相關文章
相關標籤/搜索