首页 > 解决方案 > 具有通用类型的 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

 

标签: androidkotlinmoshi

解决方案


已经是该类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 实例是次优的。你应该重复使用它。


推荐阅读