使用Gson解析Json

來源:互聯網
上載者:User

標籤: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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.