標籤:size int 解釋 轉化 serial 添加 解析json 實體 array
使用Gson解析JsonOverview
在日常的開發中,我們經常得需要解析Json資料,煩不勝煩,還好有 Gson
這一開源類庫來協助我們處理這些繁瑣的工作。大體上Json的資料格式大概可以分為以下幾種:
- Json資料是一個對象
- Json資料是一個對象數組
- Json資料是一個對象,但是對象中嵌套著其他的對象或者數組
PS: 本文代碼通過Kotlin語言描述。
解析簡單對象
這是一個Student類的Json資料,接下來我們要通過Gson解析它。
{ "s_num":"s00001", "age":18, "gender":"M", "name":"LD"}
要想使用Gson解釋Json資料,首先得有已有與Json資料相對應的實體類。
data class Student(@SerializedName("s_num") val studentNumber: String, val name: String, val age: Int, val gender: Char) { override fun toString(): String { return "Student(studentNumber='$studentNumber', name='$name', age=$age, gender=$gender)" }}
上面的類就是我們為瞭解釋Json而建立的實體類了,請注意,我們在實體類中使用了一個 @SerializedName
註解,這個註解的作用解釋,給我們的屬性添加一個重新命名。 因為在上面的Json資料中 s_num
這個欄位名,是不太符合我們的編程規範的。但是我們又得解析它,所以通過這個註解來解決命名的問題。
下面是解析代碼:
private fun analystJson(json: String) { val student = Gson().fromJson<Student>(json, Student::class.java) student.toString().e()}//輸出結果***************************************************************** Student(studentNumber='s00001', name='LD', age=18, gender=M) *****************************************************************
解析Json數組
[ { "age":18, "gender":"M", "name":"LD", "s_num":"s00001" }, { "age":19, "gender":"M", "name":"LD2", "s_num":"s00002" }, { "age":20, "gender":"M", "name":"LD3", "s_num":"s00003" }]
解析代碼如下
private fun analystJsonArray(json: String) { val gson = Gson() val jsonParser = JsonParser() val jsonElement = jsonParser.parse(json) val jsonArray = jsonElement.asJsonArray val studentList = mutableListOf<Student>() jsonArray.forEach { studentList.add(gson.fromJson<Student>(it, Student::class.java)) } "Student Count=${studentList.size}".i()}//輸出結果******************** Student Count=3 ********************
簡化代碼
寫到這裡,解析Json還是非常麻煩啊,我們得把這些代碼封裝一下,支援泛型才能解放我們的雙手。
//將解析Json對象的方法封裝一下private fun <T> analystJson(json: String, cls: Class<T>): T { return Gson().fromJson<T>(json, cls)}//調用封裝的方法val obj: Student = analystJson(json, Student::class.java)obj.toString().e()//輸出結果***************************************************************** Student(studentNumber='s00001', name='LD', age=18, gender=M) *****************************************************************
上面我們已將將Gson解析對象的方法封裝了一下,現在這個方法可以支援任意類型的對象的轉化了,但是上面還是有些繁瑣啊,我們又傳遞了個 Class
對象進去作為參數來協助我們解析Json,多傳遞了這個一個參數,我們的方法就顯得很笨拙了,那麼我們能不能想辦法不傳遞Class對象呢? 當然的可以的了。
private inline fun <reified T> analystJson(json: String): T { return Gson().fromJson<T>(json, T::class.java)}
這裡採用了一些Kotlin的特性 inline(內嵌函式)
和 reified(類型具體化)
關於這兩點這裡就不在多說,有興趣的可以自行查閱一下資料。
總結
實際上不管是,解析單個的Json對象,還是解析Json數組或者是更複雜的嵌套對象,使用上面的簡化方法就都可以解決了。
使用Gson解析Json