android - 具有通用类型的 Moshi jason 适配器
问题描述
我想使用具有泛型类型的 Moshi 适配器。
这是我的通用类型适配器代码,
fun <T> getObjectFromJson(typeOfObject: Class<T>, jsonString: String): T? {
val moshi = Moshi.Builder().build()
val jsonAdapter: JsonAdapter<T> = moshi.adapter<T>(
typeOfObject::class.java
)
return jsonAdapter.fromJson(jsonString)!!
}
此代码不起作用。它抛出一个错误,
平台类 java.lang.Class 需要显式注册 JsonAdapter
但是,如果我不使用这样的泛型,
fun getObjectFromJson(jsonString: String): UserProfile? {
val moshi = Moshi.Builder().build()
val jsonAdapter: JsonAdapter<UserProfile> = moshi.adapter<UserProfile>(
UserProfile::class.java
)
return jsonAdapter.fromJson(jsonString)!!
}
然后代码工作正常。
这是UserProfile类,
@Parcelize
@JsonClass(generateAdapter = true)
data class UserProfile(
@get:Json(name = "p_contact")
val pContact: String? = null,
@get:Json(name = "profile_pic")
var profilePic: String? = null,
@get:Json(name = "lname")
val lname: String? = null,
@get:Json(name = "token")
var token: String? = null,
@get:Json(name = "fname")
val fname: String? = null,
@SerializedName("_id")
@get:Json(name = "_id")
var id: String? = null,
@get:Json(name = "email")
var email: String? = null,
@SerializedName("refresh_token")
@get:Json(name = "refresh_token")
var refreshToken: String? = null
) : Parcelable
解决方案
已经是该类typeOfObject
的一个实例Class<T>
,您::class.java
不需要调用它:它返回Class<Class>
,这不是您想要的。
只是改变
val jsonAdapter: JsonAdapter<T> = moshi.adapter<T>(typeOfObject::class.java)
至
val jsonAdapter: JsonAdapter<T> = moshi.adapter<T>(typeOfObject)
顺便说一句:在每次反序列化时创建一个新的 Moshi 实例是次优的。你应该重复使用它。
推荐阅读
- python - 附加两个基于 bng Easting / Northing 的数据框
- javascript - 从二维数组创建可编辑的 HTML 表格
- python - Chrome/Firefox 在新选项卡中打开 PDF 并且不以无头模式保存 (Selenium+Python)
- java - Quartz cron 表达式在星期六的不同时间运行
- sql-server - 有没有办法检查对象是 SQL Server 中的表还是视图?
- python - 检查日期是否与另一个崩溃
- reactjs - How do I hide the codes that appear in the sourcemap in the react application?
- amazon-web-services - 使用 AWS 证书管理器请求证书时出错
- android - 如何使亚马逊应用内购买 (IAP) 2.0 与 Android R8 一起使用
- machine-learning - 是否可以使用 Vision coreML 执行批量预测