У меня есть класс ответа - MyResponse, как показано ниже, для вызова сервера с помощью Retrofit2. resource
- это массив объектов.
public class MyResponse {
@SerializedName("success")
@Expose
private Boolean success;
@SerializedName("resource")
@Expose
private Array[] resource;
public ApiResponse(Boolean done, Array[] resource) {
this.done = done;
this.resource = resource;
}
//getters and setters
}
В Activity я создал массив, как показано ниже:
MyResponse decodedResponse = response.body();
Array[] catsList = decodedResponse.getResource();
И у меня есть класс модели Category
, как показано ниже:
public class Category {
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("category")
@Expose
private String category;
//getters, setter and constructor
}
Каждый объект указанного выше массива catsList соответствует указанной выше модели категории (с идентификаторами и ключами категории). Теперь, как мне сделать массив категорий (Category[]
) из указанного выше массива catsList?
Я не могу сделать это как Category[] catsList = decodedResponse.getObject();
, потому что хочу создать больше массивов и для других моделей. Поэтому я планирую создать общий класс MyResponse, как указано выше, и при необходимости преобразовать его сгенерированный массив в конкретную модель.
Также не поддерживается следующий метод (после изменения Array[] =to=> Object[]
в MyResponse). Это дает java.lang.ClassCastException: java.lang.Object[] cannot be cast to my.package.Category[]
исключение.
Object[] catsList = decodedResponse.getObject();
Category[] catsListCooked = (Category[]) catsList;
РЕДАКТИРОВАТЬ: Мой ответ JSON от сервера имеет одинаковый стиль для всех типов запросов и использует одну модель для одного типа запроса. Поскольку Retrofit хочет знать, какой класс модели будет использовать для вызова, чтобы выполнить вызов, как показано ниже.
@GET()
Call<MyResponse> getCategories(@Url String url);
Примечание. Поправьте меня, если я могу сделать это по-другому. Поскольку я звоню, как упомянуто выше, мне нужен класс, чтобы сделать звонок.
Итак, что я хочу сделать, так это создать основной ответ (MyResponse, как указано выше), который будет получать ответ, а затем использовать каждую модель для получения полученных данных в соответствии с типом запроса. Невозможно использовать модель напрямую при звонке, потому что у меня есть собственный ответ JSON от сервера.
т.е. если модель используется напрямую, она выдает ошибки, такие как ожидаемый BEGIN_ARRAY, но предоставляет BEGIN_OBJECT или ожидаемый BEGIN_OBJECT, но предоставляет BEGIN_ARRAY.
Как указано ниже, из предложенных дубликатов это предложение от ytg выглядит нормально для достижения решения. Но при использовании Arrays.copyOf (), как предложено там, кажется, что он не создает массив Category[]
, чтобы быть полезным, поскольку он дает ошибку «... не может быть сохранен в целевом массиве типа ...». Также другие решения из этого вопроса в моем случае невозможны.
Category[]
иCategory
не одно и то же и несовместимы по назначению. - person glglgl   schedule 04.05.2016