Ожидаемый BEGIN_ARRAY, но был BEGIN_OBJECT с Retrofit - PullRequest
0 голосов
/ 04 мая 2020

Итак, я пытаюсь загрузить данные из API-интерфейса Corona.

Это мой интерфейс:

public interface RKIApi {

String BASE_URL = "https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/";

@Headers("Content-Type: application/json")
@GET("query?where=1%3D1&outFields=cases,deaths,cases_per_population,county,death_rate&returnGeometry=false&outSR=4326&f=json")
Call<List<County>> getCounties();
}

Это мой класс данных округа, в который я буду sh конвертировать данные, которые я получаю:

public class County {

@SerializedName("county")
@Expose
private String county;

@SerializedName("cases")
@Expose
private int cases;

@SerializedName("deaths")
@Expose
private int deaths;

@SerializedName("cases_per_population")
@Expose
private float casesPerPopulation;

@SerializedName("death_rate")
@Expose
private float deathRate;

public County(String county, int cases, int deaths, float casesPerPopulation, float deathRate) {
    this.county = county;
    this.cases = cases;
    this.deaths = deaths;
    this.casesPerPopulation = casesPerPopulation;
    this.deathRate = deathRate;
}

... геттеры и сеттеры ....

И вот как я пытаюсь загрузить данные:

Retrofit retrofit = new Retrofit.Builder().baseUrl(RKIApi.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

    RKIApi apiService = retrofit.create(RKIApi.class);

    Call<List<County>> call = apiService.getCounties();

    call.enqueue(new Callback<List<County>>() {
        @Override
        public void onResponse(@NonNull Call<List<County>> call,@NonNull Response<List<County>> response) {
            ... Do something ...
        }

        @Override
        public void onFailure(@NonNull Call<List<County>> call,@NonNull Throwable t) {
            System.out.println("========== ERROR ==========");
            System.out.println(t.getMessage());
        }
    });

Однако, когда я пытаюсь открыть приложение с включенным отладчиком, все, что я получаю, это ожидаемый BEGIN_ARRAY, но он был BEGIN_OBJECT в строке 1, столбце 2, пути $. Теперь это очевидно, потому что JSON не начинается со списка округов, однако я хотел бы только загрузить их. Я попытался использовать тег Expose, как показано выше, но он все еще не работает.

Любая помощь очень ценится:)

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Это означает, что любой из ваших параметров становится нулевым или не имеет ничего в json. Предположим, вы анализируете "name" = "pavel", но в json, то есть "name" = null

0 голосов
/ 04 мая 2020

Проблема и причина ошибки либо в плохо разработанном API, либо в неверно интерпретированном API. Ваш API не отправляет список объектов. Скорее всего, API выдает JSON примерно так:

 { ...content }

, который представляет собой не список объектов, а отдельный объект. Модернизация ожидает что-то вроде этого:

 [ { ....County } { ..County  }? ]

, потому что Вы сказали, чтобы модификация возвращала LIST из List<County>.

, где [ означает массив Объектов. Таким образом, чтобы это исправить, у вас есть 2 варианта. Либо измените API, чтобы он всегда возвращал квадратные скобки даже для пустого списка, например [] или [{ one object }] для одного результата.

Либо анализируйте результаты вручную. Проверьте этот вопрос здесь на stackoverflow:

Вручную проанализировать часть ответа при использовании Retrofit

...