预期为 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