gson 从泛型字符串创建json

esbemjvw  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(182)

我试图做一些非常简单的事情(至少,应该是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的参数?

xwbd5t1u

xwbd5t1u1#

此处的问题很可能是以下行:

stringToJson(text, responseDataClass::class.java)

这将使用类的类,该类始终为Class<Class>。您应该只使用responseDataClass调用stringToJson函数(不使用::class.java):

stringToJson(text, responseDataClass)

另外,看起来您对stringToJson结果的处理不正确。结果是T的示例(实际上是T?,因为Gson.fromJson可以返回null)。但是,您将其转换为Gson
正确的代码可能如下所示:

class EasyJson<T>(val url: String, private val responseDataClass: Class<T>) {
    var text: String
    var json: T?

    init {
        text = getJsonFromUrl(URL(url)) //another function does this and is working fine
        json = stringToJson(text, responseDataClass)
    }

    private fun <T> stringToJson(data: String, model: Class<T>): T? {
        return Gson().fromJson(data, model)
    }
}

(除非您的代码在EasyJson中包含更多逻辑,否则将JSON提取和解析转移到一个函数中可能更有意义,而不是为此使用一个专用类。)

相关问题