改型返回空响应Android

时间:2019-01-26 19:00:08

标签: java android get retrofit retrofit2

我正在使用Retrofit进行API调用,处理响应时会出现下一个错误(需要从API调用中获取数据)-

  

尝试在空对象引用上调用接口方法'java.lang.Object java.util.List.get(int)'

我不知道我是否做对了。无论如何,这是我的代码。

以下是网址链接: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 :(得分:0)

您共享的API链接以以下格式返回响应:

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

您正在将响应对象设置为 Result 类型,它实际上是json响应中根元素help中的一个子元素。 response.body()将包含help,而result将是它的子元素。由于未正确解析,因此您得到的响应为空。

您将需要在模型类中包括根元素,并更新API调用以将该类类型用作响应类型。

答案 1 :(得分:0)

您从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()