You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Retrofit请求报错:Expected BEGIN_ARRAY but was BEGIN_OBJECT 求助

问题解决方案

你的错误核心是API返回的是JSON对象,但你在接口里定义的返回类型是List<Titles>,Moshi解析时期望数组(BEGIN_ARRAY)却拿到了对象(BEGIN_OBJECT),所以报错。同时你的DataClass结构和实际返回的JSON完全不匹配,这也是修改无效的原因。以下是具体修复步骤:


步骤1:修正ApiService的返回类型

把getHome()的返回类型从List<Titles>改成匹配最外层JSON的顶级数据类:

interface WebtoonApiService {
    @Headers("X-RapidAPI-Key: MyKey", "X-RapidAPI-Host: webtoon.p.rapidapi.com")
    @GET("titles/list?genre=ALL&sortOrder=READ_COUNT&startIndex=0&pageSize=1&language=en")
    suspend fun getHome(): WebtoonResponse // 修改此处返回类型

    @GET("titles/get-info?titleNo=300138&language=en")
    suspend fun getTitle(): String
}

步骤2:重新构建匹配JSON结构的DataClass

完全按照返回的JSON层级定义数据类,每个嵌套对象对应一个数据类:

package com.example.myapplication.network

import com.squareup.moshi.Json

// 最外层响应对象
data class WebtoonResponse(
    val message: Message
)

// message对应的嵌套对象
data class Message(
    val type: String,
    val service: String,
    val version: String,
    val result: Result
)

// result对应的嵌套对象
data class Result(
    val titleInfo: TitleInfo,
    val challengeAuthorPatreon: ChallengeAuthorPatreon
)

// titleInfo对应的嵌套对象
data class TitleInfo(
    val titleNo: Int,
    val language: String,
    val writingAuthorName: String,
    val writingCommunityAuthorId: String,
    val representGenre: String,
    val genreInfo: GenreInfo,
    val title: String,
    val synopsis: String,
    val serviceStatus: String,
    val thumbnail: String,
    val starScoreAverage: Double,
    val readCount: Long,
    val favoriteCount: Int,
    val totalServiceEpisodeCount: Int,
    val lastEpisodeRegisterYmdt: Long,
    val linkUrl: String,
    val firstEpisodeNo: Int,
    val genreColor: String,
    val badgeType: String,
    val likeitCount: Long,
    val ageGradeNotice: Boolean,
    val rewardAdExposureDays: Int,
    val previewDisabled: Boolean
)

// genreInfo对应的嵌套对象
data class GenreInfo(
    val name: String,
    val mask: String,
    val index: Int,
    val color: String,
    val code: String
)

// challengeAuthorPatreon对应的嵌套对象
data class ChallengeAuthorPatreon(
    val userId: String,
    val userName: String,
    val patronUrl: String,
    val usePatronage: Boolean
)

步骤3:修正ViewModel中的调用逻辑

调整代码以接收新的返回类型,并可以直接获取具体数据:

class HomeViewModel : ViewModel(){
    init {
        getHome()
    }
    val _status = MutableLiveData<String>()
    val status: LiveData<String> = _status

    private fun getHome(){
        viewModelScope.launch {
            try{
                val response = WebtoonApi.retrofitService.getHome()
                // 示例:获取漫画标题并打印
                val webtoonTitle = response.message.result.titleInfo.title
                Log.d("TEST", "漫画标题:$webtoonTitle")
                _status.value = "Success: 已获取漫画数据"
            } catch (e: Exception){
                _status.value = "Failure: ${e.message}"
            }
        }
    }
}

额外注意事项

  • 你的Moshi配置已经添加了KotlinJsonAdapterFactory(),无需修改。
  • 如果API返回的某个字段可能为null,可在数据类中用?标记为可空类型(比如val someField: String?)。

内容的提问来源于stack exchange,提问作者Zares

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:16:06