Gson解析异常com.google.gson.internal.LikedTreeMap connot be case to class

1,108 阅读1分钟

异常

   fun <T> json2List(gson: Gson, json: String?, clazz: Class<T>): List<T>? {
        val typeToken: TypeToken<List<T>> = object : TypeToken<List<T>>() {}
        return try {
            gson.fromJson(json, typeToken.type)
        } catch (e: Exception) {
            null
        }
    }

使用上面的函数进行解析时出现 com.google.gson.internal.LikedTreeMap connot be case to class ,出现这种情况通常是泛型除了问题,由于类型擦除,解析前无法在运行时获取真正的类型 T。

处理方法

  • 方法一

    fun <T> toList2(json: String?, cls: Class<T>?): List<T> {
        val mList: MutableList<T> = ArrayList()
        try {
            val array = JsonParser().parse(json).asJsonArray
            for (elem in array) {
                mList.add(gson.fromJson(elem, cls))
            }
        } catch (e: Exception) {
        }
        return mList
    }
    

    使用示例:

    val jsonList = "[{\"isSuccess\":false,\"name\":\"a\"},{\"isSuccess\":true,\"name\":\"b\"}]"
    val list4 = GsonKtx.toList2(jsonList,TestBean::class.java)
    println(list4)
    list4.forEach {
      println(it.name)
    }
    
  • 方法二

    fun <T> toList(gson: Gson, json: String?, clz: Class<Array<T>>?): List<T>? {
        return try {
            val ts: Array<T> = gson.fromJson(json, clz)
            mutableListOf(*ts)
        } catch (e: Exception) {
            null
        }
    }
    

    使用示例:

    val jsonList = "[{\"isSuccess\":false,\"name\":\"a\"},{\"isSuccess\":true,\"name\":\"b\"}]"
    val list = GsonKtx.toList(Gson(),jsonList,Array<TestBean>::class.java)
    list.forEach {
         println(it.name)
    }
    

    参考

泛型方法 Gson解析 com.google.gson.internal.LinkedTreeMap cannot be cast to XXX

关于Gson泛型解析的解决方案

使用 gson,出现 LinkedTreeMap cannot be cast to xxx

com.google.gson.internal.LinkedTreeMap