У меня есть API, который возвращает одну из следующих схем:
Успех (данные найдены)
{
item_count: 83,
items_per_page: 25,
offset: 25,
items: [
{ ... },
{ ... },
{ ... },
...
]
}
Ошибка (нетнайденные данные)
{
success: false,
error: {
code: 200,
message: "Server is busy"
}
}
Я хочу использовать Retrofit 2 с GSON для создания оболочки вокруг этого 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