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
相关产品推荐
相关产品推荐

