美文网首页临时
Gson字符串数组转成List对象(泛型、Kotlin)

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

作者: Android高级工程师 | 来源:发表于2019-05-12 20:33 被阅读0次

    把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)
        }
    }
    

    完美运行:

    喜欢点击+关注哦

    相关文章

      网友评论

        本文标题:Gson字符串数组转成List对象(泛型、Kotlin)

        本文链接:https://www.haomeiwen.com/subject/ctrhaqtx.html