Ожидаемый BEGIN_ARRAY, но был BEGIN_OBJECT в строке 1, столбец 2 модифицирован2

#android #api #kotlin #retrofit2

Вопрос:

У меня проблема с моим проектом. Это простое подключение к приложению 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 }  

Но я получил исключение IllegalStateException, как в названии. Вот мои файлы:

DTO

 data class CharacterDTO(  val docs: Listlt;CharacterDatagt;,  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(): Flowlt;Listlt;Charactergt;gt; = 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(): Listlt;BookDTOgt;   suspend fun getCharacters(): Listlt;CharacterDTOgt;   suspend fun getCharacterById(characterId: String): CharacterDTO }  

И последнее, это моя просьба:

 @Provides  @Singleton  fun provideLotrApi(): LotrApi{  val request = Retrofit.Builder()  .client(OkHttpClient.Builder().addInterceptor { chain -gt;  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. какую часть я должен изменить, чтобы получить более 1 объекта?

2. Я не знаю вашего бэкенда и его API. Я могу только догадываться, неправильно ли вы запросили неверную конечную точку сервера, конечная точка была реализована неправильно или, возможно, здесь происходит что-то еще. Все, что я знаю, это то, что JSON, опубликованный выше, содержит только один символ.