没有用于通用类型的JsonAdapter(在通用函数内部)

时间:2020-01-01 14:04:53

标签: kotlin moshi

在将JSON解析为通用函数中的数据类时,我遇到错误No JsonAdapter for R,我研究并尝试了许多方法,但仍然无法正常工作。 问题是generic function不知道泛型参数R的实际类型,因此我在解析时无法手动分配R的类型。

如何解决此问题? :(

fun <T, R> sendRequest(msg: Deribit.Request.Message<T>): Deribit.Response.Result<R> {
    ...
        val type = object : TypeToken<Deribit.Response.Result<R>>() {}.type

        return moshi.adapter<Deribit.Response.Result<R>>(
            type
        ).fromJson(jsonElement.toString())
    ...
}

我还使用reified函数,该函数返回ParameterizedTypeReference,但仍然无法正常工作

private inline fun <reified T: Any> typeRef(): ParameterizedTypeReference<T> = object: ParameterizedTypeReference<T>(){}
...
// USAGE
val data = moshi.adapter<Deribit.Response.Result<R>>(
            typeRef<Deribit.Response.Result<R>>().type
        ).fromJson(jsonElement.toString())

谢谢你,谢谢!!

1 个答案:

答案 0 :(得分:1)

制作

inline fun <reified T, reified R> sendRequest...

应该工作。或者,传递您需要或足以将其构造为参数的类型。例如

fun <T, R> sendRequest(msg: Deribit.Request.Message<T>, clazzR: Class<R>): Deribit.Response.Result<R> {
    // Type object for Result<R>
    val type = Types.newParameterizedType(Deribit.Response.Result::class.java, clazzR)
    ...
}