@Clubber_77

Как правильно написать обобщенный метод?

Задача состоит в том, чтобы с сайта по запросу забрать Json, и десериализовать его в объект класса.
public class Answer {
    private Info info;
    private Episode[] results;
}


с помощью метода

public  Answer requestAllEpisodes(){
        String jsonObject = restClient.get()
                .uri(API_ENDPOINT_EPISODE)
                .retrieve()
                .body(String.class);
        return new Gson().fromJson(jsonObject,  Answer.class);
    }


В зависимости от параметров запроса в ответе может быть массив из трех разных объектов
public class Episode {
    private int	id;
    private  String name;
    private  String air_date;
    private  String episode;
    private String[] characters;
    @SerializedName("url")
    private String thisEpisodeEndpoint;
    private String created;
}

public class Location {
    private int	id;
    private  String name;
    private  String type;
    private  String dimension;
    private List<Character> residents;
    @SerializedName("url")
    private String thisLocationEndpoint;
    private String created;

}

public class Character{

    @SerializedName("id")
    private int id;

    @SerializedName("name")
    private  String name;

    @SerializedName("status")
    private  String status;

    @SerializedName("species")
    private  String species;

    @SerializedName("type")
    private  String type;

    @SerializedName("gender")
    private  String gender;

    @SerializedName("origin")
    private Location originLocation;

    @SerializedName("location")
    private Location lastKnownLocation;

    @SerializedName("image")
    private String avatarImage;

    @SerializedName("episode")
    private String[] episodesUrl;

    @SerializedName("url")
    private String thisCharacterEndpoint;

    @SerializedName("created")
    private String created;
}


Соответственно, хорошо бы сделать обобщенный класс
public class Answer<T> {
    private Info info;
    private T[] results;
}


Я понимаю, что нужно переписать метод, чтобы он принимал на вход класс обобщенный каким-либо из трех объектов каким-то подобным образом, и передавал его вместо Answer.class в метод fromJson(), но на текущий момент, чтобы я не пробовал получаю ClassCastException при десериализации.

public <T> Answer<T> requestAllEpisodes(Class<T> clazz){
        String jsonObject = restClient.get()
                .uri(API_ENDPOINT_EPISODE)
                .retrieve()
                .body(String.class);
        return new Gson().fromJson(jsonObject,  Answer.class);
    }
  • Вопрос задан
  • 218 просмотров
Решения вопроса 1
@Clubber_77 Автор вопроса
Решение найдено. Спасибо всем неравнодушным.

Сам класс
public class Answer<T> {
    private Info info;
    private T[] results;
}


и обобщенный метод, который должен вернуть объект этого класса
public <T> Answer<T> requestAll(String endpoint, Class<T> tClass){
        String jsonObject = restClient.get()
                .uri(endpoint)
                .retrieve()
                .body(String.class);
        Type type = TypeToken.getParameterized(Answer.class,  tClass).getType();
        return new Gson().fromJson(jsonObject, type);
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@My1Name
Используйте Tree model. Проверяйте поля по имени и стройте ту сущность, которой соответствует поле объекта. А потом уже обобщайте как хотите. Или создавайте свой обобщённый класс (Pojo), проверяйте каждое поле и стройте сразу обобщённый объект, в котором некоторые поля могут быть со значением null.

См. Как игнорировать неизвестные поля JSON
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы