异常
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