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

Retrofit结合Moshi解析复杂JSON 自定义适配器抛出解析异常求解

问题成因
  • 核心问题是手动提前创建两个列表类型的JsonAdapter时,使用了独立的、配置不完整的Moshi实例:生成List<OrderHistoryDTO>和List<TypeInfoDTO>适配器时,你新建的Moshi.Builder仅添加了日期适配器,生成的适配器内部绑定了这个残缺的Moshi上下文,后续你将这两个适配器硬注册到最终的完整Moshi实例中时,它们不会切换到新的Moshi上下文,解析嵌套字段时找不到对应类型的适配器,直接抛出异常。
  • 冗余错误操作:你完全不需要手动为List<XxxDTO>这类泛型列表提前创建、注册适配器。只要DTO类添加了@JsonClass(generateAdapter = true)注解,Moshi会自动生成对应类型的合规适配器,自动处理嵌套泛型列表、引用类型的解析逻辑,手动注册反而会覆盖Moshi自动生成的正确适配器,触发解析故障。
修正方案

直接删除所有手动构造列表Type、提前生成列表适配器的冗余代码,统一在一个Moshi构建流程中注册需要的自定义适配器即可,修正后的初始化代码如下:

val moshi = Moshi.Builder()
    .add(MoshiDateAdapter(MoshiDateAdapter.DATE_UTC))
    // 若OrderTypeEnum有自定义解析规则,在此处添加对应适配器,无特殊规则可省略
    .build()

return Retrofit.Builder()
    .addConverterFactory(MoshiConverterFactory.create(moshi))
    .client(okHttpClient)
    .baseUrl(apiServerUrl)
    .build()
    .create(SupplyOrdersServices::class.java)

额外校验项:请确认自定义的MoshiDateAdapter可以正确匹配接口返回的所有日期字段格式,OrderTypeEnum的枚举值名称与接口返回的字符串完全一致,避免格式不匹配导致的解析错误。

内容的提问来源于stack exchange,提问作者Martis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:06:35