Moshi从1.8.0升级至1.12.0后覆盖安装转换器返回null问题
问题根因与解决方案
该异常由Moshi 1.9.0及以上版本对Kotlin数据类的序列化/反序列化规则变更导致,核心涉及两个兼容性变动:
- Kotlin 1.4+修改了参数名默认存储规则,配合Moshi 1.9+的字段匹配逻辑,会对未显式声明序列化注解的字段出现匹配失败
- Moshi 1.8.0序列化数据时默认不会写入带默认值的构造参数字段,升级到1.12.0后如果未开启Kotlin适配器的容错逻辑,反序列化时会直接返回null而非用默认值填充
修复步骤
- 检查Moshi实例初始化配置,优先添加Kotlin专属适配器工厂,注意必须放在其他自定义工厂之前:
val moshi = Moshi.Builder() // Kotlin适配器工厂必须放在第一个位置 .add(KotlinJsonAdapterFactory()) // 其他自定义适配器 .add(/*自定义适配器实例*/) .build()
- 给所有用于SharedPreference、Room序列化的data class添加
@JsonClass(generateAdapter = true)注解,显式指定使用代码生成适配器,规避反射适配的兼容性问题:
@JsonClass(generateAdapter = true) data class LocalStorageBean( val id: String, val count: Int = 0 )
- 兼容旧版本已存储的序列化数据,开启容错配置,关闭未知字段异常抛出:
val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory()) .failOnUnknown(false) .build()
- 检查依赖配置,保证所有Moshi相关组件版本完全统一:
implementation "com.squareup.moshi:moshi:1.12.0" implementation "com.squareup.moshi:moshi-kotlin:1.12.0" kapt "com.squareup.moshi:moshi-kotlin-codegen:1.12.0"
完成配置后清理项目重新构建即可,覆盖安装场景的反序列化会自动兼容旧版存储数据,不会丢失用户本地存储内容。
内容的提问来源于stack exchange,提问作者S.Murugan
相关产品推荐
相关产品推荐

