【问题标题】:No JsonAdapter for Generic Type (inside generic function)通用类型没有 JsonAdapter(在通用函数内部)
【发布时间】:2020-01-02 06:12:10
【问题描述】:

我在将 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())
    ...
}

我也使用了返回 ParameterizedTypeReference 的 reified 函数,但它仍然无法正常工作

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())

谢谢你和最好的问候!!!

【问题讨论】:

    标签: kotlin moshi


    【解决方案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)
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      相关资源
      最近更新 更多