Я создал простую конечную точку REST:
http://<server_address>:3000/sizes
Этот URL-адрес возвращает очень простой ответ, содержащий массив json следующим образом:
[
{ "id": 1, "name": "Small", "active": true },
{ "id": 2, "name": "Medium", "active": true },
{ "id": 3, "name": "Large", "active": true }
]
Теперь я пытаюсь использовать этот ответ, используя Retrofit 2 с GSON.
Я добавил модель:
@lombok.AllArgsConstructor
@lombok.EqualsAndHashCode
@lombok.ToString
public class Size {
private int id;
private String name;
private boolean active;
@SerializedName("created_at")
private String createdAt;
@SerializedName("updated_at")
private String updatedAt;
}
И сервис:
public interface Service {
@GET("sizes")
Call<List<Size>> loadSizes();
}
Я создал экземпляр "Дооснащения":
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://<server_address>:3000")
.addConverterFactory(GsonConverterFactory.create())
.build();
И мое обслуживание:
Service service = retrofit.create(Service.class);
Теперь, пытаясь вызвать данные:
service.loadSizes().enqueue(new Callback<List<Size>>() {
@Override
public void onResponse(Call<List<Size>> call, Response<List<Size>> response) {
for(Size size: response.body()) {
System.out.println(size.toString());
}
}
@Override
public void onFailure(Call<List<Size>> call, Throwable t) {
System.out.println(t.getMessage());
}
});
В результате получается исключение:
java.lang.IllegalStateException: Ожидаемый BEGIN_OBJECT, но был STRING в строке 1 column 18 path $[0].name
Я предполагаю, что ошибка вызвана тем, что REST API возвращает ответ, который представляет собой массив или объект.
- Правильно ли я?
- Каков самый простой способ заставить этот код работать?
Служба REST не может быть изменена, поэтому ответ должен оставаться как есть.
Кроме того, десериализация вышеупомянутого json с использованием чистого GSON может быть выполнена:
Type sizesType = new TypeToken<List<Size>>(){}.getType();
List<Size> size = new Gson().fromJson(json, sizesType);
Но я не знаю, как сделать Retrofit 2. чтобы использовать это.
Спасибо заранее.