Kotlin入門(31)JSON字符串的解析

json是App進行網絡通訊最多見的數據交互格式,Android也自帶了json格式的處理工具包org.json,該工具包主要提供了JSONObject(json對象)與JSONArray(json數組)的解析處理。下面分別介紹這兩個工具類的用法:
一、JSONObject
JSONObject的經常使用方法以下所示:
構造函數 : 從指定字符串構造出一個JSONObject對象。
getJSONObject : 獲取指定名稱的JSONObject對象。
getString : 獲取指定名稱的字符串。
getInt : 獲取指定名稱的整型數。
getDouble : 獲取指定名稱的雙精度數。
getBoolean : 獲取指定名稱的布爾數。
getJSONArray : 獲取指定名稱的JSONArray數組對象。
put : 添加一個JSONObject對象。
toString : 把當前JSONObject輸出爲一個json字符串。
二、JSONArray
JSONArray的經常使用方法以下所示:
length : 獲取JSONArray數組對象的長度。
getJSONObject : 獲取JSONArray數組對象在指定位置處的JSONObject對象。
put : 往JSONArray數組對象中添加一個JSONObject對象。
使用JSONObject和JSONArray對json串進行手工解析,處理過程比較常規,完成該功能的Kotlin代碼與Java代碼大同小異。下面直接給出Kotlin解析json串的經常使用代碼片斷,包括如何構造json串、如何解析json串,以及如何遍歷json串:java

    //構造json串
    private val jsonStr: String
        get() {
            val obj = JSONObject()
            obj.put("name", "地址信息")
            val array = JSONArray()
            for (i in 0..2) {
                val item = JSONObject()
                item.put("item", "第${i+1}個元素")
                array.put(item)
            }
            obj.put("list", array)
            obj.put("count", array.length())
            obj.put("desc", "這是測試串")
            return obj.toString()
        }

    //解析json串
    private fun parserJson(jsonStr: String?): String {
        val obj = JSONObject(jsonStr)
        var result = "name=${obj.getString("name")}\n" +
                "desc=${obj.getString("desc")}\n" +
                "count=${obj.getInt("count")}\n"
        val listArray = obj.getJSONArray("list")
        //util表示的範圍是左閉右開區間。如下語句至關於for (i in 0..listArray.length() - 1)
        for (i in 0 until listArray.length()) {
            val item = listArray.getJSONObject(i)
            result = "${result}\titem=${item.getString("item")}\n"
        }
        return result
    }

    //遍歷json串
    private fun traverseJson(jsonStr: String?): String {
        var result = ""
        val obj = JSONObject(jsonStr)
        val it = obj.keys()
        while (it.hasNext()) { // 遍歷JSONObject
            var key = it.next().toString()
            result = "${result}key=$key, value=${obj.getString(key)}\n"
        }
        return result
    }

前面提到Kotlin對json串的手工解析沒有什麼好辦法,實際上是有更高層次的辦法。手工解析json串實在是麻煩,費時費力還容易犯錯,因此好漢不吃眼前虧,此路難走不如另尋捷徑,捷徑即是甩開手工解析幾條街的自動解析。json

既然是自動解析,首先要制定一個規則,約定json串有哪些元素,具體對應怎樣的數據結構;其次還得有個自動解析的工具,俗話說得好,沒有金剛鑽、不攬瓷器活。對於捷徑第一要素的json數據結構定義,Kotlin特有的數據類正好派上用場了,字段名、字段類型、字段默認值等色香味俱全,還有equals、copy、toString等下酒小菜,只要開發者輕拉珠簾即是一大桌的滿漢全席。到底有多麼省事,且看下面的用戶信息數據類,包括姓名、年齡、身高體重、婚否等字段存取在內的完整功能,僅需一行Kotlin代碼就所有搞定了:數組

data class UserInfo(var name: String="", var age: Int=0, var height: Long=0L, var weight: Float=0F, var married: Boolean=false)

 

接着解決捷徑第二要素的工具使用,json解析除了系統自帶的org.json,谷歌公司也提供了一個加強庫gson,專門用於json串的自動解析。不過因爲是第三方庫,所以首先要修改模塊的build.gradle文件,在裏面的dependencies節點下添加下面一行配置,表示導入指定版本的gson庫:網絡

    compile "com.google.code.gson:gson:2.8.2"

 

其次還要在kt源碼文件頭部添加以下一行導入語句,表示後面會用到Gson工具類:數據結構

import com.google.gson.Gson

 

完成了以上兩個步驟,而後就能在代碼中調用Gson的各類處理方法了,Gson經常使用的方法有兩個,一個名叫toJson,可把數據對象轉換爲json字符串;另外一個名叫fromJson,可將json字符串自動解析爲數據對象,方法調用的代碼格式爲「fromJson(json串, 數據類的類名::class.java)」。Kotlin的數據類定義代碼尚且只有一行,這裏的json串自動解析仍舊只需一行代碼,實實在在爲開發者節省了很多功夫。下面是個經過gson庫實現json自動解析的Kotlin代碼例子:ide

class JsonConvertActivity : AppCompatActivity() {
    private val user = UserInfo(name="阿四", age=25, height=160L, weight=45.0f, married=false)
    private val json = Gson().toJson(user)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_json_convert)
        btn_origin_json.setOnClickListener { tv_json.text = "json串內容以下:\n$json" }
        btn_convert_json.setOnClickListener {
            //利用Gson包直接將json串解析爲對應格式的數據類對象
            val newUser = Gson().fromJson(json, UserInfo::class.java)
            tv_json.text = "從json串解析而來的用戶信息以下:" +
                    "\n\t姓名=${newUser.name}" +
                    "\n\t年齡=${newUser.age}" +
                    "\n\t身高=${newUser.height}" +
                    "\n\t體重=${newUser.weight}" +
                    "\n\t婚否=${newUser.married}"
        }
    }
}
相關文章
相關標籤/搜索