预期为 BEGIN_ARRAY,但在第 1 行第 2 列改造时为 BEGIN_OBJECT2
Posted
技术标签:
【中文标题】预期为 BEGIN_ARRAY,但在第 1 行第 2 列改造时为 BEGIN_OBJECT2【英文标题】:Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 retrofit2 【发布时间】:2021-12-20 20:06:39 【问题描述】:我的项目有问题。它是与 api 应用程序的简单连接。我想获取这样的信息:
"docs": [
"_id": "5cf5805fb53e011a64671582",
"name": "The Fellowship Of The Ring"
,
"_id": "5cf58077b53e011a64671583",
"name": "The Two Towers"
,
"_id": "5cf58080b53e011a64671584",
"name": "The Return Of The King"
],
"total": 3,
"limit": 1000,
"offset": 0,
"page": 1,
"pages": 1
但我得到了标题中的非法状态异常。这是我的文件:
DTO
data class CharacterDTO(
val docs: List<CharacterData>,
val limit: Int,
val offset: Int,
val page: Int,
val pages: Int,
val total: Int
)
data class CharacterData(
val _id: String,
val birth: String,
val death: String,
val gender: String,
val hair: String,
val height: String,
val name: String,
val race: String,
val realm: String,
val spouse: String,
val wikiUrl: String
)
fun CharacterData.toCharacter(): Character
return Character(
_id = _id,
birth = birth,
death = death,
gender = gender,
name = name,
race = race
)
它在这个文件上崩溃了: 用例
lass GetCharactersUseCase @Inject constructor(
private val repository: LotrRepository
)
operator fun invoke(): Flow<List<Character>> = flow
try
val characters = repository.getCharacters() // on this line it crash
Log.d(Tag,characters.toString())
catch (e: HttpException)
Log.d(Tag,e.toString())
catch (e: IOException)
Log.d(Tag,e.toString())
这是存储库
interface LotrRepository
suspend fun getBooks(): List<BookDTO>
suspend fun getCharacters(): List<CharacterDTO>
suspend fun getCharacterById(characterId: String): CharacterDTO
最后这是我的要求:
@Provides
@Singleton
fun provideLotrApi(): LotrApi
val request = Retrofit.Builder()
.client(OkHttpClient.Builder().addInterceptor chain ->
val request = chain.request().newBuilder().addHeader("Authorization", "Bearer $Constants.API_KEY").build()
chain.proceed(request)
.build())
.baseUrl(Constants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(LotrApi::class.java)
return request
经过研究,我忘了处理这部分
"total": 3,
"limit": 1000,
"offset": 0,
"page": 1,
"pages": 1
但更改我的 DTO 文件后它仍然无法工作
【问题讨论】:
【参考方案1】:上面提供的 JSON 仅包含一个 CharacterDTO
对象,但您希望获得此类对象的列表。更改后端以返回列表或将 getCharacters()
声明替换为:
suspend fun getCharacters(): CharacterDTO
【讨论】:
我应该更改哪个部分以获得超过 1 个对象? 我不知道您的后端及其 API。我只能猜测您是否错误地请求了不正确的服务器端点,端点实施不正确,或者这里可能发生了其他事情。我只知道上面发布的 JSON 只包含一个字符。以上是关于预期为 BEGIN_ARRAY,但在第 1 行第 2 列改造时为 BEGIN_OBJECT2的主要内容,如果未能解决你的问题,请参考以下文章
获得错误预期BEGIN_ARRAY但在第1行第2列路径$是BEGIN_OBJECT
Retrofit2:预期为 BEGIN_ARRAY,但在第 1 行第 268 列路径 $[0].images 处为 STRING
预期BEGIN_ARRAY但在第1行第2列是BEGIN_OBJECT
预期 BEGIN_ARRAY 但在第 1 行第 2 列是 BEGIN_OBJECT。如何解决?
改造预期的 begin_array 但在第 1 行第 2 列路径 $ Android Studio 处是 begin_object
Retrofit2 Android:预期 BEGIN_ARRAY 但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT