Задать вопрос
@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);
    }
  • Вопрос задан
  • 239 просмотров
Подписаться 1 Средний 8 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    Java-разработчик с нуля
    12 месяцев
    Далее
  • Академия Эдюсон
    Java-разработчик: тариф Базовый
    8 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Java-разработчик + ИИ
    9 месяцев
    Далее
Решения вопроса 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
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Казань
от 75 000 ₽
ИТРУМ Ростов-на-Дону
от 75 000 ₽
Яндекс Москва
от 180 000 до 350 000 ₽