博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gson字符串数组转成List对象(泛型、Kotlin)
阅读量:6246 次
发布时间:2019-06-22

本文共 2224 字,大约阅读时间需要 7 分钟。

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

fun main(){    val list = mutableListOf(Bean(0, "123"), Bean(1, "456"))    val json = list.toJson()    val type = object :TypeToken
>(){}.type val newList = Gson().fromJson
>(json,type) newList.forEach { println(it) }}fun Any.toJson(): String = Gson().toJson(this)data class Bean( val code:Int, val msg:String)复制代码

运行结果如下:

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

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

main方法如下:

fun main(){    val list = mutableListOf(Bean(0, "123"), Bean(1, "456"))    val json = list.toJson()    json.toBeanList
().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
= arrayOf(clz)}复制代码

main方法如下:

fun 
String.toBeanList(clazz: Class<*>): List
= Gson().fromJson
>(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::class.java).forEach { println(it) }}复制代码

结果:

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

//重点inline fun 
String.toBeanList(): List
= Gson().fromJson
>(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
().forEach { println(it) }}复制代码

完美运行:

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

你可能感兴趣的文章
Java中方法覆盖的约束
查看>>
用路由器做CA的基于数字证书的ipsec ***
查看>>
运维必须掌握的Linux面试题【转自CentOS中文站】
查看>>
poj1459 Power Network(最大流)
查看>>
相机拍照友盟检测crash是为什么?
查看>>
翻转单词顺序列(剑指offer)
查看>>
ashx和ajax利用POST导致编码错误
查看>>
virtual oj ACboy needs your help again!
查看>>
ubuntu 安装 nginx php mysql
查看>>
HDU-1213-How Many Tables
查看>>
奇怪的道路[JXOI2012]
查看>>
Windows+MyEclipse+MySQL【连接数据库报错caching_sha2_password】
查看>>
导入数据
查看>>
UMeditor上传图片配置
查看>>
Homestead小结
查看>>
2015年iOS开发总结
查看>>
CocoaPods 安装与使用
查看>>
学习笔记:查最大内存
查看>>
javascript设计模式与开发实践(二)- 封装和原型模式
查看>>
1475: 方格取数
查看>>