Kotlin中Gson不支持MutableLiveData<model>反序列化致类型转换异常
错误原因
MutableLiveData<T>是Jetpack提供的生命周期感知型数据容器类,本身和你定义的photosModel业务实体类不存在继承关系- 调用Gson的
fromJson方法时指定的目标类型是photosModel::class.java,反序列化得到的结果只会是photosModel类型的实例,直接强转为MutableLiveData<photosModel>不符合Java/Kotlin的类型转换规则,因此抛出类型转换异常
最简解决方案
这是最常用、侵入性最低的修复方式,不需要修改Gson配置也不需要自定义适配器:
- 定义变量时直接初始化
MutableLiveData实例,避免使用lateinit降低空风险:
// 注意:Kotlin类名建议遵循大驼峰命名规范,photosModel建议改为PhotosModel val _photosModel = MutableLiveData<photosModel>()
- 反序列化拿到业务实体实例后,调用MutableLiveData的赋值方法将实例传入即可:
val gson = Gson() // 直接指定反序列化目标类型为photosModel,不需要转Any val modelObj = gson.fromJson(response.toString(), photosModel::class.java) // 主线程赋值用value,子线程赋值用postValue _photosModel.value = modelObj
可选方案:自定义Gson TypeAdapter
如果你确实需要让Gson直接反序列化出MutableLiveData<T>类型的实例,可以自定义TypeAdapter实现,但通常不推荐这么做,会增加不必要的序列化/反序列化复杂度:
- 自定义适配
MutableLiveData的TypeAdapter,在反序列化逻辑中先解析出泛型对应的实体类实例,再手动封装进MutableLiveData实例返回 - 构建Gson实例时将自定义TypeAdapter注册到Gson实例中即可使用
内容的提问来源于stack exchange,提问作者Osama Ibrahim
相关产品推荐
相关产品推荐

