通过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)
1条答案
按热度按时间ecr0jaav1#
看起来您的数据类与JSON结构不匹配。Gson不会报告丢失或未知的属性,这就是这种不匹配可能不明显的原因。
JSON数据表明应该有一个封闭的数据类,我们称之为
Response
:然后
Api
接口中的函数应该将其作为返回类型:(Also,请再次检查您问题中的代码,
Api
接口有一个名为getImage
的函数,但在下面的代码中您调用了getVideo
;并且日志输出显示DataItem
具有诸如extension
之类的附加属性,这些属性在上面的DataItem
类的代码中没有显示。)