在改造 2 中序列化 json 错误

Serializing json in retrofit 2 errors

提问人:Catosh 提问时间:11/13/2023 更新时间:11/13/2023 访问量:14

问:

我正在 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)。问题在这里:

  1. 如何调试此类问题?

  2. 如何确保解析正文而不是整个响应内容?

  3. (可选): 我看到了该应用程序的不同实现,其中编码人员期望使用 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()
                [...]

这似乎有效。为什么前者会崩溃,而后者不会?

JSON Kotlin 序列化 改造2

评论


答: 暂无答案