implementation 'com.dhh:gson-ktx:version'
<dependency>
<groupId>com.dhh</groupId>
<artifactId>gson-ktx</artifactId>
<version>version</version>
<type>pom</type>
</dependency>
使用方法如下( Sample )
class GSONTest {
data class Student(var name: String, var age: Int)
companion object {
@JvmStatic
fun main(args: Array<String>) {
val xiaoMingJson = """{"name":"XiaoMing","age":22}"""
val xiaoLiJson = """{"name":"XiaoLi","age":20}"""
val classJson = """[$xiaoLiJson,$xiaoMingJson]"""
val studentMapJson = """{"xiaoMing":$xiaoMingJson,"xiaoLi":$xiaoLiJson}"""
val classMapJson = """{"class1":$classJson,"class2":$classJson}"""
val xiaoMing: Student = GSON.fromJson<Student>(xiaoMingJson)
println(xiaoMing)//print -> Student(name=XiaoMing, age=22)
val xiaoLi: Student = GSON.fromJson<Student>(xiaoLiJson)
println(xiaoLi)//print -> Student(name=XiaoLi, age=20)
println(GSON.toJson(xiaoLi))//print -> {"name":"XiaoLi","age":20}
val list: List<Student> = GSON.fromJson<List<Student>>(classJson)
println(list)//print -> [Student(name=XiaoLi, age=20), Student(name=XiaoMing, age=22)]
val studentMap: Map<String, Student> =
GSON.fromJson<Map<String, Student>>(studentMapJson)
println(studentMap)//print -> {xiaoMing=Student(name=XiaoMing, age=22), xiaoLi=Student(name=XiaoLi, age=20)}
println(studentMap["xiaoMing"]?.name)//print -> XiaoMing
val map: Map<String, List<Student>> = GSON.fromJson<Map<String, List<Student>>>(classMapJson)
println(map) //print -> {class1=[Student(name=XiaoLi, age=20), Student(name=XiaoMing, age=22)], class2=[Student(name=XiaoLi, age=20), Student(name=XiaoMing, age=22)]}
println(map.toJson())//print -> {"class1":[{"name":"XiaoLi","age":20},{"name":"XiaoMing","age":22}],"class2":[{"name":"XiaoLi","age":20},{"name":"XiaoMing","age":22}]}
}
}
}
val xiaoMing: Student = GSON.fromJson(xiaoMingJson)
val list: List<Student> = GSON.fromJson(classJson)
val studentMap: Map<String, Student> = GSON.fromJson(studentMapJson)
val map: Map<String, List<Student>> = GSON.fromJson(classMapJson)
val xiaoMing = GSON.fromJson<Student>(xiaoMingJson)
val list = GSON.fromJson<List<Student>>(classJson)
val studentMap = GSON.fromJson<Map<String, Student>>(studentMapJson)
val map = GSON.fromJson<Map<String, List<Student>>>(classMapJson)
val xiaoMingJson = """{name:"XiaoMing",age:22}"""
val student = xiaoMingJson.toBean<Student>()
val list = classJson.toBean<List<Student>>()
源码非常少,也非常简单,原理就是通过 Kotlin 的内联函数 ( inline ) 和 具体化的类型参数 ( reified ) 特性,将泛型 "T" 通过 TypeToken 获取到 Type 进而进行反序列化。
object GSON {
/**
* 初始化默认的 [com.google.gson.Gson] 转换器
*/
var gson = GsonBuilder().setLenient().create()
inline fun <reified T> fromJson(json: String): T {
val type = object : TypeToken<T>() {}.type
return gson.fromJson(json, type)
}
inline fun <reified T> fromJson(jsonElement: JsonElement): T {
val type = object : TypeToken<T>() {}.type
return gson.fromJson(jsonElement, type)
}
fun toJson(any: Any) = gson.toJson(any)
fun toJson(jsonElement: JsonElement) = gson.toJson(jsonElement)
}
inline fun <reified T> String.toBean() = GSON.fromJson<T>(this)
inline fun <reified T> JsonElement.toBean() = GSON.fromJson<T>(this)
fun Any.toJson() = GSON.toJson(this)
fun JsonElement.toJson() = GSON.toJson(this)