學習Android之解析JSON格式資料
阿新 • • 發佈:2022-03-15
解析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}") } }
到此為止,網路資料解析方面基本瞭解了。