Несколько объектов, которые будут объявлены во время выполнения для модифицированной модели - PullRequest
1 голос
/ 17 апреля 2019

Я использую tmdb для получения подробной информации о телешоу. У него есть конечная точка, которая выглядит следующим образом: https://api.themoviedb.org/3/tv/1399?api_key=API_KEY&append_to_response=season/1,season/2,season/3,season/4,season/5,season/6,season/7,season/8 Здесь добавление к ответу берет номера сезона, чтобы предоставить детали этого сезона в том же запросе. Это был пример для телешоу с 8 сезонами. Если у него есть, скажем, 2 сезона, то конечной точкой будет https://api.themoviedb.org/3/tv/1399?api_key=API_KEY&append_to_response=season/1,season/2

Теперь при создании класса модели для обработки этого запроса проблема заключается в том, что времена года возвращаются как объекты, а не как массив. Так что может быть много сезонов.

{
    "id": ...,
    ...,
    ...,
    "season/1": {...},
    "season/2": {...},
    "season/3": {...}
}

Каждый из этих сезонов нуждается в новом классе моделей для себя, и число объектов также является переменным. Как мне справиться с этим?

Запрос с 8 сезонами

Запрос с 3 сезонами

1 Ответ

0 голосов
/ 17 апреля 2019

Самое простое решение для этого - просто определить ваш ответ типа ResponseBody, который выглядит следующим образом:

@GET(value = "/{yourFirstNumber}/tv/{yourSecondNumber}")
Call<ResponseBody> getStuff(@Path("yourFirstNumber") String whateverYouWantToNameThis1,
                            @Path("yourSecondNumber") String whateverYouWantToNameThis2,
                            @Query("api_key") String apiKey,
                            @Query("append_to_response") String appendToResponse);

Просто убедитесь, что вы называете эти числовые переменные тем, чем они являются, вместо того, чтобы использовать фразу, которую я использовал, поскольку я не знаком с API.

При этом ваш запрос вызова будет выглядеть так:

Call<ResponseBody> call = yourService.getStuff(yourObject);
call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                L.m("RESPONSE CODE == " + response.code());
                if(response.isSuccessful()){
                    ResponseBody successResponse = response.body();
                    //This means it was successful (IE a 200)
                } else {
                    ResponseBody errorResponse = response.errorBody();
                    //This means there was an error (IE a 402)
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                //Handle your error here
            }
        });

Оттуда вы можете анализировать ваш successResponse несколькими различными способами.

Например, я использую GSON и несколько других методов в этого класса , но это действительно зависит от того, как вы хотите его проанализировать. Если вы хотите преобразовать его в строку, используйте successResponse.string() (, а не опечатку), обязательно используйте метод string (), а не toString () ) и преобразуйте его из сериализованного ответа в тот, который вы можно легко использовать.

...