Moshi JSON适配器与泛型类型



我想使用一个通用类型的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

typeOfObjectClass<T>类的一个实例,你调用::class.java是不必要的:它返回Class<Class>,这不是你想要的。

只改变

val jsonAdapter: JsonAdapter<T> = moshi.adapter<T>(typeOfObject::class.java)

val jsonAdapter: JsonAdapter<T> = moshi.adapter<T>(typeOfObject)

顺便说一下:在每次反序列化时创建一个新的Moshi实例是次优的。你应该重用它。

最新更新