天天看點

從零開始搞懂Android網絡請求——JSON資料的解析與Gson架構的使用

什麼是JSON:

  • JSON 指的是 JavaScript 對象表示法(JavaScript Object Notation)
  • JSON 是輕量級的文本資料交換格式
  • JSON 獨立于語言 (單純的資料格式,不受語言的限制)
  • JSON 具有自我描述性,更易了解

    以上為官方對于Json的解釋,其實JSON就是一種JavaScript對象資料表示格式,不受程式語言的限制,以至于成為了目前前背景資料互動的通用資料格式,并逐漸地取代了XML。

本篇部落客要講解解析JSON資料的方法,包括:

  • 原生解析方法:使用了JSON官方的一個Jar包,Android SDK裡面已經自帶了,是以不需要單獨下載下傳。
  • GSON架構解析:google 提供的快速json的第三方架構。

JSON原生解析

JSONObject對象解析

首先看一下我們即将解析的資料:

{
    "data":{
        "title":"How to get JOSN data",
        "author":"Zergen",
        "content":"Please follow me"
    }
}
           

基本原則:

  • { }表示JSONObject對象
  • [ ]表示JSONArray對象

資料分析:

    那麼我們如何去解析呢?首先這段資料中,有一個data字段,裡面包含了3個關于data的屬性資訊。

    我們首先分析一下,整個資料被{ }包住的,是以整個資料是一個JSONObject對象。

解析步驟:

  1. 執行個體化一個JSONObject對象,把獲得資料作為參數帶進去。
  2. 使用obj.getXXX方法取得對應的值,例如:getInt,getString,getJSONObject等
public void Jsonpra(){
        String Jsondata ="{\"data\":{\"title\":\"How to get JOSN data\",\"author\":\"Zergen\",\"content\":\"Please follow me\"}}";

        try {
            JSONObject obj = new JSONObject(Jsondata); //執行個體化JSONObject對象,并參入參數:JSON對象資料
            JSONObject data = obj.getJSONObject("data"); //data對應的值是一個JSONObject對象
            String title = data.getString("title");
            String author = data.getString("author");
            String content = data.getString("content");
            Log.e("TAG", "标題是:" + title + " " + "作者是:" + author + " " + "内容是:" + content);
        } catch (JSONException e) {
            e.printStackTrace();
        }


    }
           

運作結果如下:

JSONArray對象解析

還是先看一下我們即将解析的資料:

{
    "data":[
        {
            "title":"How to get JOSN data",
            "author":"Zergen",
            "content":"Please follow me"
        },
        {
            "title":"What is JSON?",
            "author":"Mark",
            "content":"JSON just is a kind of data format "
        }
    ]

}
           

資料分析:

    因為data對應的值用[ ]包住的,是以這個時候data字段對應的值不再是個JSONObject對象了,而是一個JSONArray數組對象了。其實解法與解析JSONObject對象是一個道理,隻不過多了一步周遊數組的步驟。

public void JsonArraypra(){
        String jsondata = "{\"data\":[{ \"title\":\"How to get JOSN data\",\"author\":\"Zergen\",\"content\":\"Please follow me\"},{\"title\":\"What is JSON?\",\"author\":\"Mark\",\"content\":\"JSON just is a kind of data format \"}]}";
        try {
            JSONObject obj = new JSONObject(jsondata);
            JSONArray data= obj.getJSONArray("data"); //擷取data對應的JsonArray對象
            for (int i = 0;i<data.length();i++){ //周遊數組
                JSONObject TempObj = data.getJSONObject(i); //參數為索引值
                String title = TempObj.getString("title");
                Log.e("TAG", "第"+(i+1)+"個标題是:"+title);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
           

運作結果如下:

E/TAG: 第1個标題是:How to get JOSN data
E/TAG: 第2個标題是:What is JSON?
           

如上我們講解了如何使用原生的代碼來解析JSON資料,但是往往在開發中,這樣的效率未免太低了,是以我們常常會用到第三方快捷解析JSON的架構,本篇部落格将會介紹GSON架構的簡單使用。

GSON架構解析

Gson解析是google 提供的快速Json的第三方架構 。Gson與原生相比最大的優點就在于可以按照bean類對資料進行解析。

要想使用Gson需要自己手動導入jar包,此處不再贅述導入方法了。

Gson解析JSONObject對象

我們還是使用和之前一樣的資料,以便于對比兩種不同的解析方法:

{
    "data":{
        "title":"How to get JOSN data",
        "author":"Zergen",
        "content":"Please follow me"
    }
}
           

解析步驟:

  1. 定義一個實體類,類名随意,但是請注意:類中成員變量名要和json資料中字段完全一緻。
  2. 執行個體化Gson對象。調用對象中fromjson方法,根據不同的情況填寫參數,詳情看下面的解析代碼:

    首先定義個實體類,名字為Essay

public class Essay {
    private String title;
    private String author;
    private String content;
    }
           

這裡隻是寫出了類裡面定義的對應json資料裡面的成員,還需要寫出類的構造函數和對應的set、get方法。

public void gsonpra(){
        String Jsondata ="{\"data\":{\"title\":\"How to get JOSN data\",\"author\":\"Zergen\",\"content\":\"Please follow me\"}}";
        try {
            JSONObject obj = new JSONObject(Jsondata);  
            String GsonData = obj.getString("data"); //把data對應的JSONObject對象當做字元串拿出來
            Gson gson = new Gson();
            Essay e = gson.fromJson(GsonData, Essay.class); //參數一:需要解析的資料(String) 參數二:class<T> 決定函數傳回的類型
            Log.e("TAG", "GSON解析:"+"标題是:" + e.getTitle() + " " + "作者是:" + e.getAuthor() + " " + "内容是:" + e.getContent());
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
           

運作結果如下:

關鍵方法為fromJson,該方法第一個參數為需要解析的json資料,第二個參數為需要解析成的目标對象的class。

Gson解析JSONArray對象

我們還是使用和之前一樣的資料:

{
    "data":[
        {
            "title":"How to get JOSN data",
            "author":"Zergen",
            "content":"Please follow me"
        },
        {
            "title":"What is JSON?",
            "author":"Mark",
            "content":"JSON just is a kind of data format "
        }
    ]

}
           

和解析JSONObject對象一樣的,首先定義個實體類,名字為Essay

public class Essay {
    private String title;
    private String author;
    private String content;
    }
           

需要注意的是,解析JSONArray數組對象所使用的fromjson方法的第二個參數需要是type類型的參數,此參數擷取比較麻煩,直接上代碼吧:

public void gsonarray(){
        String jsondata = "{\"data\":[{ \"title\":\"How to get JOSN data\",\"author\":\"Zergen\",\"content\":\"Please follow me\"},{\"title\":\"What is JSON?\",\"author\":\"Mark\",\"content\":\"JSON just is a kind of data format \"}]}";
        try {
            JSONObject obj = new JSONObject(jsondata);
            String GsonData = obj.getString("data");
            Gson gson = new Gson();
            Type type = new TypeToken<ArrayList<Essay>>(){}.getType();  //通過TypeToken中間類來擷取Essay的Type
           ArrayList<Essay> essays =  gson.fromJson(GsonData, type);    //type決定函數傳回值的type
            for (int i =0;i<essays.size();i++){
                Essay e = essays.get(i);
                Log.e("TAG", "GSON解析數組:" + "第" + (i + 1) + "個标題是:" + e.getTitle());
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

    }
           

運作結果如下:

E/TAG: GSON解析數組:第1個标題是:How to get JOSN data
E/TAG: GSON解析數組:第2個标題是:What is JSON?
           

如上我們講解了如何使用Gson架構來解析JSON資料

總結

其實除了Gson還有許多第三方解析JSON資料的架構,比如阿裡巴巴的fastJson,以後如果有機會的話,我也會把此架構的使用方法更新在這裡