You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中Gson反序列化LinkedTreeMap转HallData类型转换异常求助

问题根源

你遇到的ClassCastException核心原因是Gson反序列化泛型集合时丢失了具体类型信息:直接用Gson.fromJson(jsonString, MutableList::class.java)的话,Gson无法识别列表内部的HallData泛型,会把每个元素默认解析成LinkedTreeMap(Gson用来临时存储JSON键值对的结构)——虽然日志打印时看起来像HallData,但实际类型是LinkedTreeMap,绑定RecyclerView Adapter时强转就会崩溃。

解决步骤

1. 用TypeToken指定泛型类型

Gson提供TypeToken来保留泛型类型信息,你需要创建一个MutableList<HallData>的具体类型实例,让Gson明确要解析的目标类型:

val gson = Gson()
// 创建TypeToken指定泛型类型
val type = object : TypeToken<MutableList<HallData>>() {}.type
// 反序列化时传入这个type
val hallDataList: MutableList<HallData> = gson.fromJson(jsonString, type)

2. 修正SharedPreferences读取逻辑

替换你原来的反序列化代码,完整读取示例:

val sharedPref = getSharedPreferences("your_pref_name", Context.MODE_PRIVATE)
val jsonString = sharedPref.getString("hall_data_key", "") ?: ""
val gson = Gson()
val type = object : TypeToken<MutableList<HallData>>() {}.type
val hallDataList: MutableList<HallData> = if (jsonString.isEmpty()) {
    mutableListOf()
} else {
    gson.fromJson(jsonString, type)
}

3. 确认Adapter的列表类型

检查你的UserAdapter中,接收的userList必须是明确的MutableList<HallData>,不能是MutableList<*>或无泛型的MutableList:

// 正确的Adapter声明
class UserAdapter(private val userList: MutableList<HallData>) : RecyclerView.Adapter<UserAdapter.ViewHolder>() {
    // ... 其他代码
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val hallData = userList[position] // 这里不会再出现类型转换异常
        // 绑定数据到UI
    }
}
额外注意点
  • 如果HallData类中有嵌套的自定义对象,确保这些对象的构造函数是无参的,或者给Gson配置了对应的反序列化适配器(比如用@SerializedName注解字段)。
  • 存储时可以直接序列化MutableList<HallData>,无需额外处理:
val jsonString = gson.toJson(hallDataList)
sharedPref.edit().putString("hall_data_key", jsonString).apply()

内容的提问来源于stack exchange,提问作者Amir Elahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:52:11