我试图做一些非常简单的事情(至少,应该是IMO):创建一个函数,接收包含一些json的字符串,并将其转换为Gson对象。
class EasyJson(val url: String, private val responseDataClass: Class<*>) {
var text: String
var json: Gson
init {
text = getJsonFromUrl(URL(url)) //another function does this and is working fine
json = stringToJson(text, responseDataClass::class.java) as Gson
}
private fun <T> stringToJson(data: String, model: Class<T>): T {
return Gson().fromJson(data, model)
}
下面是调用类:
class CallingClass() {
val url="https://api"
init {
test()
}
data class ApiResponse(
val count: Number,
val next: Number?,
val previous: Number?
)
private fun test(){
val json = EasyJson(url, ApiResponse::class.java)
}
}
然而,当我这样做时,我得到了以下异常:
java.lang.UnsupportedOperationException: Attempted to deserialize a java.lang.Class. Forgot to register a type adapter?
我如何在这里使用泛型数据类作为Gson的参数?
1条答案
按热度按时间xwbd5t1u1#
此处的问题很可能是以下行:
这将使用类的类,该类始终为
Class<Class>
。您应该只使用responseDataClass
调用stringToJson
函数(不使用::class.java
):另外,看起来您对
stringToJson
结果的处理不正确。结果是T
的示例(实际上是T?
,因为Gson.fromJson
可以返回null
)。但是,您将其转换为Gson
。正确的代码可能如下所示:
(除非您的代码在
EasyJson
中包含更多逻辑,否则将JSON提取和解析转移到一个函数中可能更有意义,而不是为此使用一个专用类。)