Преобразование массива в массив определенных объектов в Java

У меня есть класс ответа - 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[], чтобы быть полезным, поскольку он дает ошибку «... не может быть сохранен в целевом массиве типа ...». Также другие решения из этого вопроса в моем случае невозможны.


person Janaka R Rajapaksha    schedule 04.05.2016    source источник
comment
@Abdelhak Мне не нужно пробовать это, чтобы увидеть, что это не сработает: Category[] и Category не одно и то же и несовместимы по назначению.   -  person glglgl    schedule 04.05.2016
comment
Возможный дубликат: stackoverflow.com / questions / 1115230 /   -  person ytg    schedule 04.05.2016
comment
вот ваш ответ: stackoverflow.com/questions/395030/   -  person BT9    schedule 04.05.2016