我有一个返回以下模式之一的 API:
成功(找到数据)
{
item_count: 83,
items_per_page: 25,
offset: 25,
items: [
{ ... },
{ ... },
{ ... },
...
]
}
失败(未找到数据)
{
success: false,
error: {
code: 200,
message: "Server is busy"
}
}
我想使用带有 GSON 的 Retrofit 2 来围绕这个 API 构建一个包装器并转换为 POJO,但是我不确定如何处理 API 可能返回两个完全不同的模式的事实。现在,我有以下课程:
public class PaginatedResponse<T> {
private int item_count;
private int items_per_page;
private int offset;
private List<T> items;
public PaginatedResponse<T>(int item_count, int items_per_page, int offset, List<T> items) {
this.item_count = item_count;
this.items_per_page = items_per_page;
this.offset = offset;
this.items = items;
}
public List<T> getItems() {
return this.items;
}
}
public class Item {
private int id;
private String name;
// ...
}
然后对于我的 API 接口,我有:
public interface API {
@GET("items")
Call<PaginatedResponse<Item>> getItems();
}
然后最后用这个我试着说:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://localhost")
.addConverterFactory(GsonConverterFactory.create())
.build();
API api = retrofit.create(API.class);
api.getItems().enqueue(new retrofit2.Callback<PaginatedResponse<Broadcast>>() {
@Override
public void onResponse(Call<PaginatedResponse<Broadcast>> call, Response<PaginatedResponse<Broadcast>> response) {
Log.d("SUCCESS", response.body().getItems().toString());
}
@Override
public void onFailure(Call<PaginatedResponse<Broadcast>> call, Throwable t) {
Log.d("FAILURE", t.toString());
}
}
只要没有抛出错误,这似乎就可以了。但是当抛出错误时,我在 Logcat 中得到以下信息并且我的应用程序崩溃:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
似乎是因为失败的 JSON 缺少一个items属性,它设置List<Item> items为null
胡子哥哥
相关分类