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

如何在Moshi中实现类似Gson的动态多态反序列化(无需特殊JSON字段)

在Moshi中实现Gson指定Class反序列化的等效功能

我在Gson中可以直接根据指定的Class对象完成反序列化,代码如下:

// mapItem - 包含应将字符串反序列化到哪个类的信息的映射项
BaseReqClass req = (BaseReqClass) gson.fromJson(jsonString, mapItem.getValue());
req.doSomeStuff()

对应的子类定义:

class AReq : BaseReqClass()
class BReq : BaseReqClass()

我会通过映射键选择对应的mapItem,以此明确指定需要实例化的子类,但不想使用PolymorphicJsonAdapterFactory(因为不想在JSON中添加额外的特殊字段),想知道在Moshi中如何实现相同行为。


解决方案

Moshi支持直接通过Class对象获取对应适配器来完成反序列化,和Gson的用法逻辑一致,步骤如下:

  1. 初始化Moshi实例:
val moshi = Moshi.Builder().build()
  1. 根据目标子类的Class对象获取JsonAdapter,并执行反序列化:
// mapItem.getValue() 即为目标子类的Class,例如AReq::class.java
val adapter = moshi.adapter(mapItem.getValue()) as JsonAdapter<BaseReqClass>
val req = adapter.fromJson(jsonString)!!
req.doSomeStuff()

补充说明

  • 这种方式无需修改JSON结构,完全由你通过映射键指定反序列化的目标子类,和Gson中的实现逻辑完全匹配。
  • 如果子类有自定义字段或需要特殊适配,只需在Moshi构建时添加对应的自定义适配器即可,不会影响这种指定Class的反序列化方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:45:46