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

如何正确为Moshi挂载自定义Data接口适配器?

Moshi自定义TypeAdapter挂载错误修复

问题根源

你创建Adapter时错误地将泛型指定为Base64TypeAdapter,而非目标处理类型Data,导致Moshi生成的Adapter是适配适配器类本身的,而非Data接口,因此调用toJson()时参数类型要求完全跑偏。

正确挂载步骤

  1. 修正Adapter泛型声明
    将创建Adapter的代码中的泛型类型从Base64TypeAdapter改为Data,这是核心修复点:

    // 错误写法
    // val dataAdapter = proxyManMoshi.adapter<Base64TypeAdapter>(Data::class.java)
    
    // 正确写法
    val dataAdapter = proxyManMoshi.adapter<Data>(Data::class.java)
    
  2. 确认TypeAdapter方法的正确性
    你的Base64TypeAdapter中@ToJson方法的参数类型是Data?,返回值是String?,这个逻辑是正确的,但需要确保:

    • Data接口的所有实现类都正确实现了toData()方法
    • 如果Data是接口,无需额外注解(Moshi会通过你添加的适配器直接处理接口类型)
  3. 完整正确代码示例

    // 自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 01:52:17