Bug com.google.gson.internal.LinkedTreeMap cannot be cast to XXX

public class BaseResponse<T> {
    public String status;
    public String msg;
    public int code;
    public T data;

欲使用 Gson.fromJson 解析出 BaseResponse<ArrayList<Channel>> :

val response:BaseResponse<ArrayList<Channel>> = fromJson<BaseResponse<ArrayList<Channel>>>(result)

Debug 下可以看到,集合中的元素都是 LinkedTreeMap 包装过的数据直接使用肯定是出问题的 , 如图 :

此时编译器提示的结果不是正确的 :

必须要对 LinkedTreeMap 进行转换 :

val toJsonTree = Gson().toJsonTree(response.data)
val testChannels: List<Channel> = Gson().fromJson<List<Channel>>(toJsonTree, object : TypeToken<List<Channel>>() {}.type)
testChannels.forEach {
   L.e("testChannels ${it.title}")

Over 🚀

另附 GsonExt

import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.JsonParser
import com.google.gson.JsonSyntaxException
import org.json.JSONException
import org.json.JSONObject
import java.lang.reflect.Type
import java.util.*
 * Title: GsonExt
 * Description: com.google.gson.Gson
 * @author javakam
 * @date 2019/12/17 10:13
private val sGson = createGson()
private fun createGson(): Gson? {
    synchronized(Gson::class.java) {
        return sGson ?: GsonBuilder().serializeNulls().create()!!
 * 将对象转成jsonString
fun <T> toJsonString(t: T): String = createGson()?.toJson(t).toString()
@Throws(JSONException::class)
fun toJson(obj: Any?): JSONObject = JSONObject(createGson()?.toJson(obj) ?: "")
// 在 kotlin 中扩展 Java 类的 Gson.fromJson 方法
// 不在传入 T 的class,inline 的作用就是将函数插入到被调用处,配合 reified 就可以获取到 T 真正的类型
inline fun <reified T : Any> fromJson(json: String): T {
    return Gson().fromJson(json, T::class.java)
 * 将json字符串转成对象
@Throws(JsonSyntaxException::class)
fun <T> fromJson(json: String?, cla: Class<T>?): T = createGson()?.fromJson(json, cla)!!
 * new TypeToken<List></List><Music>>(){}.getType()
@Throws(JsonSyntaxException::class)
fun <T> fromJson(jsonStr: String?, type: Type?): List<T> {
    return createGson()?.fromJson(jsonStr, type) ?: emptyList()
复制代码
  • 私信