gson 如何使用json解析来自远程服务器的响应?我使用改型和承载令牌

kzmpq1sx  于 2023-02-22  发布在  其他
关注(0)|答案(1)|浏览(179)

通过okhttp日志,我知道我从远程服务器得到响应。但是当我试图解析响应时,我收到null!如何正确解析来自服务器的响应以获取数据?
我的数据对象:

@Parcelize
data class DataItem(

    @field:SerializedName("name")
    val name: String? = null,

) : Parcelable

我的API:

interface Api {

    @GET("v1/media/list/image")
    suspend fun getImage(): DataItem
}

我的改装对象:

private val httpClient = OkHttpClient
        .Builder()
        .protocols(listOf(Protocol.HTTP_1_1))
        .addInterceptor(BearerTokenInterceptor(TOKEN))
        .addInterceptor(logInterceptor())

    //get api by retrofit
    private val api: TVApi by lazy {
        val retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .client(httpClient.build())
            .build()
        retrofit.create(TVApi::class.java)
    }

    private fun logInterceptor() : HttpLoggingInterceptor {
        val interceptor = HttpLoggingInterceptor()
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)

        return interceptor
    }

我尝试解析响应:

private val scope = CoroutineScope(Dispatchers.IO)

    private fun getNetworkResponse() {

        scope.launch {
            try {
                Log.d(MY_TAG, "api: ${api.getVideo()}")

            } catch (e: IOException) {
                Log.e(MY_TAG, "IOException: $e")
            } catch (e: HttpException) {
                Log.e(MY_TAG, "HttpException: $e")
            }
        }
    }

确定http日志:

{"code":200,"message":"Success","data":[{"name"....}

我的日志:

api: DataItem(extension=null, size=null, name=null, url=null)
ecr0jaav

ecr0jaav1#

看起来您的数据类与JSON结构不匹配。Gson不会报告丢失或未知的属性,这就是这种不匹配可能不明显的原因。
JSON数据表明应该有一个封闭的数据类,我们称之为Response

data class Response(
    val code: Int,
    val message: String,
    val data: List<DataItem>,
)

然后Api接口中的函数应该将其作为返回类型:

interface Api {

    @GET("v1/media/list/image")
    suspend fun getImage(): Response
}

(Also,请再次检查您问题中的代码,Api接口有一个名为getImage的函数,但在下面的代码中您调用了getVideo;并且日志输出显示DataItem具有诸如extension之类的附加属性,这些属性在上面的DataItem类的代码中没有显示。)

相关问题