提问人:Catosh 提问时间:11/13/2023 更新时间:11/13/2023 访问量:14
在改造 2 中序列化 json 错误
Serializing json in retrofit 2 errors
问:
我正在 Google 上遵循一些 kotlin 路径,对于书架应用程序,我想解析和序列化对此 GET 请求的响应: https://www.googleapis.com/books/v1/volumes?q=jazz+history
我正在将 retrofit2 与此转换器一起使用(来自 Mars 应用程序)
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
为了构建改造对象,我正在这样做:
private val retrofit: Retrofit = Retrofit.Builder()
.addConverterFactory(Json.asConverterFactory("application/json".toMediaType()))
.baseUrl(baseUrl)
.build()
这是我的可序列化:
@Serializable
data class QueryResponse(
val kind: String,
val totalItems: Int,
val items: List<Book>?,
)
这是我界面中的方法:
@GET("volumes")
suspend fun getBooks(@Query("q") query: String): List<QueryResponse>
解析响应时,出现错误:
kotlinx.serialization.json.internal.JsonDecodingException: Expected start of the array '[', but had 'EOF' instead at path:
看起来我没有正确解析 json(根据其他答案,也许我正在解析 reponse.content 而不是 response.body)。问题在这里:
如何调试此类问题?
如何确保解析正文而不是整个响应内容?
(可选): 我看到了该应用程序的不同实现,其中编码人员期望使用 gson 作为序列化程序<>而不是 List<>,然后在响应成功时继续检索正文:
@GET("volumes")
suspend fun getBooks(@Query("q") query: String): Response<QueryResponse>
[...]
override suspend fun getBooks(query: String): List<Book>? {
return try {
val res = bookshelfApiService.getBooks(query)
if (res.isSuccessful) {
res.body()?.items ?: emptyList()
[...]
这似乎有效。为什么前者会崩溃,而后者不会?
答: 暂无答案
评论