Gson常用操作

1、获取json某个字段值

不需要先解析成对象,通过JsonElement实现

 try {
            val jumpJson = "{\"iOS\":{\"module\":\"maintenance\",\"action\":\"pushToMaintenance\"},\"android\":{\"module\":\"appointmentMaintai\",\"action\":\"pushToMaintenance\"}}"
            val rootElement = JsonParser.parseString(jumpJson)?.asJsonObject
            val androidElement = rootElement?.get("android")?.asJsonObject
            val module = androidElement?.get("module")?.asString
            val action = androidElement?.get("action")?.asString
            if(!module.isMyBlankOrNull() && !action.isMyBlankOrNull()){
                println("$module $action")
                return
            }
        }catch (e:Exception){

        }

2、json和对象互转

import com.google.gson.Gson
import org.junit.Test
class KTTest {
    data class Person(val name:String,val sex:String,val age:Int)
    @Test
    fun test() {
        //对象转json
        val json = Gson().toJson(Person("皓娇","女",18))
        println(json)
        //json转对象
        val person = Gson().fromJson(json,Person::class.java)
        println(person)
    }

}

 加一个泛型的扩展方法

fun <T> String.json2Obj(): T {
        val typeT = object : TypeToken<T>(){}.type
        return Gson().fromJson<T>(this, typeT)
    }

这时候你发现是行不通的,报java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to Person,如果想研究其他写法,会更加麻烦,不建议,还是老老实实直接用类转比较好。

3、json和List互转

import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import org.junit.Test


class KTTest {
    data class Person(val name: String, val sex: String, val age: Int)
    @Test
    fun test() {
        //list转json
        val list = arrayListOf(Person("皓娇1号", "女", 18), Person("皓娇2号", "女", 18))
        val json = Gson().toJson(list)
        println(json)
        //json转list
        val newList = Gson().fromJson<List<Person>>(json, object : TypeToken<List<Person>>() {}.type)
        println(newList)
    }

}

 

4、json转包含泛型的对象

一般网络回调都会包含泛型的方式,方便统一处理。例如:Response<T>{}


class GsonTest2 {
    @Test
    fun test() {
        val resp = BaseResponse(200,Person("皓娇","女",18),"成功")
        val json = Gson().toJson(resp)
        val a = Gson().fromJson<BaseResponse<Person>>(json,getRespType(Person::class.java))
        println(a)
    }

}

data class Person(val name: String, val sex: String, val age: Int)
data class BaseResponse<T>(val code:Int,val data:T?,val msg:String)

fun getRespType(clz: Class<*>) = object : ParameterizedType {
    override fun getRawType(): Type = BaseResponse::class.java
    override fun getActualTypeArguments(): Array<out Type> = arrayOf(clz)
    override fun getOwnerType(): Type? = null
}

如果data是List类型,还要在getActualTypeArguments的值上处理,上才艺:

class GsonTest2 {
    @Test
    fun test() {
        val list = arrayListOf(Person("皓娇1号", "女", 18), Person("皓娇2号", "女", 18))
        val resp = BaseResponse(200,list,"成功")
        val json = Gson().toJson(resp)
        val a = Gson().fromJson<BaseResponse<List<Person>>>(json,getRespListType(Person::class.java))
        println(a)
    }

}

data class Person(val name: String, val sex: String, val age: Int)
data class BaseResponse<T>(val code:Int,val data:T?,val msg:String)


fun getRespListType(clz: Class<*>) = object : ParameterizedType {
    override fun getRawType(): Type = BaseResponse::class.java
    override fun getActualTypeArguments(): Array<out Type> = arrayOf(getType(List::class.java, clz))
    override fun getOwnerType(): Type? = null
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值