如何正确为Moshi挂载自定义Data接口适配器?
Moshi自定义TypeAdapter挂载错误修复
问题根源
你创建Adapter时错误地将泛型指定为Base64TypeAdapter,而非目标处理类型Data,导致Moshi生成的Adapter是适配适配器类本身的,而非Data接口,因此调用toJson()时参数类型要求完全跑偏。
正确挂载步骤
修正Adapter泛型声明
将创建Adapter的代码中的泛型类型从Base64TypeAdapter改为Data,这是核心修复点:// 错误写法 // val dataAdapter = proxyManMoshi.adapter<Base64TypeAdapter>(Data::class.java) // 正确写法 val dataAdapter = proxyManMoshi.adapter<Data>(Data::class.java)确认TypeAdapter方法的正确性
你的Base64TypeAdapter中@ToJson方法的参数类型是Data?,返回值是String?,这个逻辑是正确的,但需要确保:Data接口的所有实现类都正确实现了toData()方法- 如果
Data是接口,无需额外注解(Moshi会通过你添加的适配器直接处理接口类型)
完整正确代码示例
// 自定义TypeAdapter保持不变 class Base64TypeAdapter { @FromJson fun fromJson(value: String?): ByteArray? { return value?.toByteArray() } @ToJson fun toJson(value: Data?): String? { return value?.toData()?.let { Base64.encodeToString(it.toByteArray(), Base64.NO_WRAP) } } } // Moshi实例与Adapter创建修正 private val proxyManMoshi = Moshi.Builder() .add(Base64ArrayTypeAdapter()) .add(Base64TypeAdapter()) .add(KotlinJsonAdapterFactory()) .build() // 正确的Adapter创建方式 val dataAdapter = proxyManMoshi.adapter<Data>(Data::class.java) // 调用示例 val dataImpl: Data = YourDataImplementation() // 你的Data接口实现类实例 val jsonString = dataAdapter.toJson(dataImpl)
额外说明
如果后续遇到多态类型(多个Data实现类)的序列化问题,可以在Data接口上添加@JsonClass(generateAdapter = false),明确告诉Moshi不要自动生成适配器,而是使用你自定义的Base64TypeAdapter处理所有实现类。
内容的提问来源于stack exchange,提问作者kuzdu
相关产品推荐
相关产品推荐

