android使用Gson來解析json

lightwing發表於2021-09-09

Gson是更流行的解析json的庫裡,我自己一把很喜歡用Gson來解析,因為直接可以寫物件和json檔案相對應

對於一個標準的後臺返回:

{
   "data": {
      "product_info": {
         "name": "澳斯貝貝 嬰兒長袖水晶絨睡袋 100cm 4",
         "image": "",
         "stock": 0
      },
      "task_list": [
         {
            "task_id": 4,
            "status": "進行中"
         }
      ]
   },
   "status": "success",
   "message": null
}

我們可以這樣來構造解析物件:

public class HistoryResponse {

    public HistoryData data;
    public String status;
    public String message;
}
public class ProductInfo {
    public String name;
    public String image;
    public int stock;
}
public class HistoryData {
    public ProductInfo product_info;
    public ArrayList<Tasks> task_list;
}
public class Tasks {
    public int id;
    public String status;
}

解析程式碼很簡潔:

public void parseAssertDataUseGson() {
    InputStream is = null;
    try {
        is = this.getAssets().open("json2.json", Context.MODE_PRIVATE);
        int length = is.available();
        byte[] buffer = new byte[length];
        is.read(buffer);
        Reader response = new StringReader(new String(buffer));
        Gson gson = new Gson();
        HistoryResponse mydata = gson.fromJson(response,HistoryResponse.class);
        Log.d("TAG","<<<<mydata="+mydata.data.task_list.get(0).status);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

程式碼在


有一點要注意,對於

[

    {

        "booid": 1,

        "bookName": "aa",

        "icon": "",

        "book_description": "aa1"

    },

    {

        "booid": 2,

        "bookName": "bb",

        "icon": "",

        "book_description": "bb1"

    },

    {

        "booid": 3,

        "bookName": "cc",

        "icon": "",

        "book_description": "cc1"

    }

]

這樣的json,我們需要用以下來解析

private void parseResponse(String response) {
    try{
        Gson gson = new Gson();
        JSONArray jsonArray = new JSONArray(response);
        ArrayList<Book> books;
        mBookResponse = new Gson().fromJson(response, new TypeToken<List<Book>>(){}.getType());

    }catch (Exception ex) {
        ex.printStackTrace();
    }

}
public class Book {

    public int booid;
    public String bookName;
    public String icon;
    public String book_description;
}

才不會出錯

如果json出現java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 81這個問題,就代表解析器expected是一個array不過

實際解析的是一個jsonObject的錯誤

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3407/viewspace-2818510/,如需轉載,請註明出處,否則將追究法律責任。

相關文章