Moshi中与GSON的gson.fromJson()、gson.toJson()等效的方法是什么
实现方案
Moshi 没有直接提供全局的 fromJson/toJson 方法,它的设计是先根据目标类型获取对应的 JsonAdapter 实例,再通过该实例完成序列化、反序列化操作,你可以按以下方式实现 JsonParser 接口:
完整实现代码
import com.squareup.moshi.Moshi import java.lang.reflect.Type class MoshiParser(private val moshi: Moshi) : JsonParser { override fun <T> fromJson(json: String, type: Type): T? { return try { val adapter = moshi.adapter<T>(type) adapter.fromJson(json) } catch (e: Exception) { // 解析异常时返回null,和原有Gson实现行为对齐 null } } override fun <T> toJson(obj: T, type: Type): String? { return try { val adapter = moshi.adapter<T>(type) adapter.toJson(obj) } catch (e: Exception) { // 序列化异常时返回null,和原有Gson实现行为对齐 null } } }
使用注意事项
- 初始化
Moshi实例时如果是 Kotlin 项目,需要引入moshi-kotlin扩展,并添加KotlinJsonAdapterFactory保证 Kotlin 类的解析正常,示例初始化代码:
val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory()) // 按需添加其他自定义Adapter .build() val jsonParser = MoshiParser(moshi)
- 如果你需要保留未知字段、或者放宽解析规则,可以在初始化
JsonAdapter时调用.lenient()方法,修改对应逻辑为moshi.adapter<T>(type).lenient()即可。 - 原有
JsonParser接口不需要做任何修改,替换实现类后就可以无缝切换到Moshi,不影响上层ROOM类型转换器的逻辑。
内容的提问来源于stack exchange,提问作者Tonnie
相关产品推荐
相关产品推荐

