1. 程式人生 > 其它 >學習Android之解析JSON格式資料

學習Android之解析JSON格式資料

解析JSON格式資料

  比起XML,JSON的優勢是體積更小,在網路傳輸上更省流量。缺點就是語義性較差。

  開始學習之前,先新建一個get_data.json檔案,裡面編寫JSON格式的內容:

        [{"id":"1","verison":"1.0","name":"shufu"},
         {"id":"2","verison":"2.2","name":"pangzi"},
         {"id":"3","verison":"3.3","name":"john"}]

 

使用JSONObject

  這是官方提供的JSONObject。傳送OkHttp請求程式碼就不用說了,修改MainActivity中的程式碼,如下所示:

    private fun parserJSONWithJSONObject(jsonData: String) {
        try {
            val jsonArray = JSONArray(jsonData)
            for (i in 0 until jsonArray.length()) {
                val jsonObject = jsonArray.getJSONObject(i)
                val id = jsonObject.getString("id")
                val name 
= jsonObject.getString("name") val version = jsonObject.getString("version") Log.d("MainActivity", "id is $id") Log.d("MainActivity", "name is $name") Log.d("MainActivity", "version is $version") } } catch (e: Exception) { e.printStackTrace() } }

 

   解析JSON的程式碼很簡單,首先將資料傳入JSONArray物件中,然後迴圈遍歷,從中取出的每一個元素都是一個JSONObject物件,每個JSONObject物件中包含了id、name、version資料,只需要呼叫getString()方法就能取出。

 

使用GSON

  這是Google提供的GSON開源庫,使用也很簡單。它的強大之處在於可以將一段JSON格式的字串自動對映成一個物件,從而不需要我們手動編寫程式碼解析了。

新增依賴

    implementation 'com.google.code.gson:gson:2.8.6'

  比如一段JSON格式的資料如下:

        {"name":"John","age":18}

  那就可以定義一個Person類,加入name和age欄位,然後只需呼叫以下程式碼就能將JSON資料自動解析成一個Person物件了:

        val gson = Gson()
        val person = gson.fromJson(jsonData, Person::class.java)

  如果需要解析的是一段JSON陣列,就要麻煩一些,比如:

        [{"name":"John","age":18},
         {"name":"Jack","age":19}, 
         {"name":"shufu","age":20}]

  這個時候需要藉助TypeToken將期望解析成的資料型別傳入fromJson()方法中:

        val typeOf = object : TypeToken<List<Person>>() {}.type
        val people = gson.fromJson<List<Person>>(jsonData, typeOf)

 

  基本用法就是這樣。

實操:

  新建一個App類,加入id、name、version欄位:

class App(val id: String, val name: String, val version: String)

 

  然後修改MainActivity中的程式碼:

    private fun parseJSONWithGSON(jsonData: String) {
        val gson = Gson()
        val typeOf = object : TypeToken<List<App>>() {}.type
        val appList = gson.fromJson<List<App>>(jsonData,typeOf)
        for (app in appList) {
            Log.d("MainActivity", "id is ${app.id}")
            Log.d("MainActivity", "name is ${app.name}")
            Log.d("MainActivity", "version is ${app.version}")
        }
    }

  

  到此為止,網路資料解析方面基本瞭解了。