具有通用类型的 Moshi JSON 适配器

Par*_*ane 3 android kotlin moshi

我想使用通用类型的 Moshi 适配器。

\n

这是我的通用类型适配器代码,

\n
fun <T> getObjectFromJson(typeOfObject: Class<T>, jsonString: String): T? {\n    val moshi = Moshi.Builder().build()\n    val jsonAdapter: JsonAdapter<T> = moshi.adapter<T>(\n        typeOfObject::class.java\n    )\n    return jsonAdapter.fromJson(jsonString)!!\n}\n
Run Code Online (Sandbox Code Playgroud)\n

该代码不起作用。它抛出一个错误,

\n
\n

平台类 java.lang.Class 需要显式注册 JsonAdapter

\n
\n

但是,如果我不\xe2\x80\x99t 使用这样的泛型类型,

\n
fun getObjectFromJson(jsonString: String): UserProfile? {\n    val moshi = Moshi.Builder().build()\n    val jsonAdapter: JsonAdapter<UserProfile> = moshi.adapter<UserProfile>(\n        UserProfile::class.java\n    )\n    return jsonAdapter.fromJson(jsonString)!!\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后代码就可以正常工作了。

\n

这是UserProfile类,

\n
 @Parcelize\n@JsonClass(generateAdapter = true)\ndata class UserProfile(\n    @get:Json(name = "p_contact")\n    val pContact: String? = null,\n\n    @get:Json(name = "profile_pic")\n    var profilePic: String? = null,\n\n    @get:Json(name = "lname")\n    val lname: String? = null,\n\n    @get:Json(name = "token")\n    var token: String? = null,\n\n    @get:Json(name = "fname")\n    val fname: String? = null,\n\n    @SerializedName("_id")\n    @get:Json(name = "_id")\n    var id: String? = null,\n\n    @get:Json(name = "email")\n    var email: String? = null,\n\n    @SerializedName("refresh_token")\n    @get:Json(name = "refresh_token")\n    var refreshToken: String? = null\n) : Parcelable\n\n \n
Run Code Online (Sandbox Code Playgroud)\n

Maf*_*for 5

已经是该类typeOfObject的一个实例Class<T>,您::class.java不必要地调用它:它返回Class<Class>,而这不是您想要的。

只是改变

val jsonAdapter: JsonAdapter<T> = moshi.adapter<T>(typeOfObject::class.java)
Run Code Online (Sandbox Code Playgroud)

val jsonAdapter: JsonAdapter<T> = moshi.adapter<T>(typeOfObject)
Run Code Online (Sandbox Code Playgroud)

顺便说一句:在每次反序列化时创建一个新的 Moshi 实例并不是最理想的。你应该重复使用它。