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
相关产品推荐
相关产品推荐

