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
相关产品推荐
相关产品推荐

