Ожидался BEGIN_ARRAY, но был BEGIN_OBJECT на пути $

Интерфейс

файл Json выглядит так

Ошибка

Попытка их получить

interface StationService {
    @GET("/bus/nearstation/latlon/[lat]/[lon]/[distance].json")
    suspend fun getStationData(): Response<List<Station>>
}

.

После изменений в ответе 1:

for (station in it) {
                stationNames.append(station.street_name)
                    .append("\n")
            }

Получение этой ошибки в MainFragment.kt: диапазон цикла For должен иметь метод iterator ()


person Sacheed Ancharaz    schedule 07.03.2020    source источник


Ответы (1)


Основываясь на структуре ответа, вам необходимо иметь обертку класса List<Station>: примените следующие изменения:

    data class ResponseData(
         @SerializedName("data") val data: NearestStation
    )

    data class NearestStation(
         @SerializedName("nearststations") val nearestStations: List<Station>
    )  

Где станция - это тот же класс данных, что и у вас сейчас. Теперь измените услугу по модернизации следующим образом:

    interface StationService {
    @GET("/bus/nearstation/latlon/[lat]/[lon]/[distance].json")
         suspend fun getStationData(): Call<ResponseData>
    }

Почему? Корневой объект в объекте JSON состоит из двух полей: code типа String (пропущено из примера) и data, который является объектом, состоит из одного поля с именем neareststations, которое представляет собой список станций. вам необходимо следовать той же структуре объектов в вашей модели класса данных.

---Редактировать:

Вам нужно изменить в своем коде следующее:

Если вы внесли изменения, о которых я упоминал, в свою услугу по модернизации, вам необходимо изменить тип

val stationData = MutableLiveData<List<Station>>()

to

val stationData = MutableLiveData<ResponseData>()

и изменить

val serviceData = service.getStationData().body()

в

val serviceData = service.getStationData().execute().body()
```.

Pay attention that ```serviceData`` is from type  ```ResponseData``` not ```List```  So replace ```?: emptyList()``` with mocked ```ResponseData``` 

person Mahdi Rajabi    schedule 07.03.2020
comment
Ошибка вывода типа: недостаточно информации для вывода параметра T в fun ‹T› emptyList (): List ‹T› Укажите это явно. - person Sacheed Ancharaz; 07.03.2020
comment
@WorkerThread приостанавливает забавный callWebService () {if (networkAvailable ()) {val retrofit = Retrofit.Builder () .baseUrl (WEB_SERVICE_URL) .addConverterFactory (MoshiConverterFactory.create ()) .build () valvice (retrofit. : class.java) val serviceData = service.getStationData (). body ()?: emptyList () stationData.postValue (serviceData)}} - person Sacheed Ancharaz; 07.03.2020
comment
Я добавил информацию в раздел редактирования ответа - person Mahdi Rajabi; 07.03.2020
comment
Я отредактировал код, как вы сказали, и получил эту новую ошибку: диапазон цикла For должен иметь метод iterator () в mainFragment.kt - person Sacheed Ancharaz; 07.03.2020
comment
В нем говорится, что параметр it не принадлежит типу Iterable. Другими словами, это не массив или объект списка. В этой строке: for (station in it). - person Mahdi Rajabi; 07.03.2020
comment
Проверьте его тип. - person Mahdi Rajabi; 07.03.2020
comment
это значение, которое было проанализировано, когда мой класс наблюдателя получил изменения данных - person Sacheed Ancharaz; 07.03.2020
comment
Проверь почту. Спасибо - person Sacheed Ancharaz; 08.03.2020
comment
Я проверил электронную почту, после применения всех рекомендованных мной изменений поменяйте it на it.data.nearstStations. Мой ответ верен, если вы проследите за всеми предыдущими изменениями, которые я просил сделать. - person Mahdi Rajabi; 08.03.2020