Дооснащение возвращается нулевой ответ Android - PullRequest
0 голосов
/ 26 января 2019

Я использую Retrofit для выполнения вызова API. Когда я обрабатываю ответ, я получаю следующую ошибку (необходимо получить данные из вызова API) -

Попытка вызвать метод интерфейса 'java.lang.Object java.util.List.get (int) 'для ссылки на пустой объект

Я не знаю, правильно ли я это делаю.В любом случае вот мой код.

Вот URL-ссылка: https://data.gov.il/api/

Модифицированный вызов -

@GET("datastore_search?resource_id=2c33523f-87aa-44ec-a736-edbb0a82975e")
Call<Result> getRecords();

Модифицированный базовый вызов -

private static Retrofit retrofit;
public static final String BASE_URL = "https://data.gov.il/api/action/";

public static Retrofit getRetrofitInstance() {
    if (retrofit == null) {
        retrofit = new retrofit2.Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}

Класс модели -

public class Result {

@SerializedName("include_total")
@Expose
private Boolean includeTotal;
@SerializedName("resource_id")
@Expose
private String resourceId;
@SerializedName("fields")
@Expose
private List<Field> fields = null;
@SerializedName("records_format")
@Expose
private String recordsFormat;
@SerializedName("records")
@Expose
private List<Record> records = null;
@SerializedName("limit")
@Expose
private Integer limit;
@SerializedName("_links")
@Expose
private Links links;
@SerializedName("total")
@Expose
private Integer total;

public Boolean getIncludeTotal() {
    return includeTotal;
}

public void setIncludeTotal(Boolean includeTotal) {
    this.includeTotal = includeTotal;
}

public String getResourceId() {
    return resourceId;
}

public void setResourceId(String resourceId) {
    this.resourceId = resourceId;
}

public List<Field> getFields() {
    return fields;
}

public void setFields(List<Field> fields) {
    this.fields = fields;
}

public String getRecordsFormat() {
    return recordsFormat;
}

public void setRecordsFormat(String recordsFormat) {
    this.recordsFormat = recordsFormat;
}

public List<Record> getRecords() {
    return records;
}

public void setRecords(List<Record> records) {
    this.records = records;
}

...

Основная деятельность -

    RecallService service = RetrofitClientInstance.getRetrofitInstance().create(RecallService.class);
    Call<Result> records = service.getRecords();

    records.enqueue(new Callback<Result>() {

        @Override
        public void onResponse(Call<Result> call, Response<Result> response) {
            Log.d(TAG, String.valueOf(response.body().getRecords().get(0).getId())); // ERROR
        }

        @Override
        public void onFailure(Call<Result> call, Throwable t) {
            Log.e(TAG, t.getMessage());

        }
    });

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Ответ, который вы получаете от API, не соответствует Result POJO.

Ответ, который вы получаете от API, выглядит следующим образом:

{
  "help": "https://data.gov.il/api/3/action/help_show?name=datastore_search",
  "success": true,
  "result": {...}
}

Используя Result POJO, вы предполагаете, что получите ответ, как показано ниже, который представляет собой json внутрифактический ответ JSON, а не то, что вы на самом деле получаете.Итак, просто создайте POJO, который справедливо представляет реальный ответ.

{
    "include_total": true,
    "resource_id": "2c33523f-87aa-44ec-a736-edbb0a82975e",
    "fields": [...],
    "records_format": "objects",
    "records":[...]
}

Попробуйте создать класс, как показано ниже (установите аннотации самостоятельно):

class Resp{
    Result result;
}

Замените класс Resultс Resp, как показано ниже и другими способами:

@GET("datastore_search?resource_id=2c33523f-87aa-44ec-a736-edbb0a82975e")
Call<Resp> getRecords();

Затем, наконец, вы можете сделать:

response.body().getResult().getRecords()
0 голосов
/ 26 января 2019

Ссылка API, которой вы поделились, возвращает ответ в следующем формате:

{"help": "https://data.gov.il/api/3/action/help_show?name=datastore_search", "success": true, "result": {...}}

Вы устанавливаете объект ответа типа Результат который на самом деле является подэлементом в корневом элементе help в ответе json.response.body() будет включать help, а result будет его подэлементом.Поскольку он не анализируется правильно, вы получаете пустой ответ.

Вам нужно будет включить корневой элемент в класс модели и обновить вызов API, чтобы использовать этот тип класса в качестве типа ответа.

...