我正在使用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());
}
});
答案 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()