Gson字符串数组转成List对象(泛型、Kotlin)

把Json转换成数组很简单,只需要用TypeToken转化一下就可以了



fun main(){
    val list = mutableListOf(Bean(0, "123"), Bean(1, "456"))
    val json = list.toJson()

    val type = object :TypeToken<List<Bean>>(){}.type
    val newList = Gson().fromJson<List<Bean>>(json,type)
    newList.forEach {
        println(it)
    }
}

fun Any.toJson(): String = Gson().toJson(this)

data class Bean(
        val code:Int,
        val msg:String
)

复制代码

运行结果如下:

但是如果有很多不同的类需要转换,那么每次都需要写TypeToken就显得很麻烦。所以很自然的就会想到用泛型实现。 代码如下:

fun <T> String.toBeanList():List<T> = Gson().fromJson(this,object:TypeToken<List<T>>(){}.type)
复制代码

main方法如下:

fun main(){
    val list = mutableListOf(Bean(0, "123"), Bean(1, "456"))
    val json = list.toJson()

    json.toBeanList<Bean>().forEach {
        println(it)
    }
}
复制代码

很显然,运行结果报错了。Gson不支持泛型解析:

可以从报错结果看到,在把LinkedTreeMap转换为Bean的过程中出错了,LinkedTreeMap是Gson库内部数据模型,换句话说我们的解析失败了,说明Gson解析时不支持泛型。

但是,我们可以用ParameterizedType 来实现。 ParameterizedTypeImpl类如下:

class ParameterizedTypeImpl(val clz: Class<*>) : ParameterizedType {
    override fun getRawType(): Type = List::class.java

    override fun getOwnerType(): Type? = null

    override fun getActualTypeArguments(): Array<Type> = arrayOf(clz)
}
复制代码

main方法如下:

fun <T> String.toBeanList(clazz: Class<*>): List<T> = Gson().fromJson<List<T>>(this, ParameterizedTypeImpl(clazz))
fun Any.toJson(): String = Gson().toJson(this)


fun main() {
    val list = mutableListOf(Bean(0, "123"), Bean(1, "456"))
    val json = list.toJson()

    json.toBeanList<Bean>(Bean::class.java).forEach {
        println(it)
    }
}
复制代码

结果:

最后结果是成功了,但是每次还需要传入class,很是麻烦。所以kotlin的reified关键字就排上用场了。 再次修改方法如下:

//重点
inline fun <reified T> String.toBeanList(): List<T> = Gson().fromJson<List<T>>(this, ParameterizedTypeImpl(T::class.java))
fun Any.toJson(): String = Gson().toJson(this)


fun main() {
    val list = mutableListOf(Bean(0, "123"), Bean(1, "456"))
    val json = list.toJson()

    json.toBeanList<Bean>().forEach {
        println(it)
    }
}
复制代码

完美运行:

转载于:https://juejin.im/post/5cd3dc23e51d453ae54a2064

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值