Дооснащение + GSON = ввод "onFailure" - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь сначала использовать Retrofit, чтобы получить данные для курса. Но я понял, что моя программа переходит к опции «onFailure».

СООБЩЕНИЕ ОБ ОШИБКЕ:

2020-03-07 18: 54: 04.499 17756-17756 / com. example.apirequest I / MainActivity: java .lang.IllegalStateException: ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY в строке 1 пути 2 столбца $

В основном я пытаюсь сначала получить только "launch_year" из API https://api.spacexdata.com/v3/launches/

Может ли кто-нибудь помочь мне выяснить причину, по которой я не могу понять это правильно?

В классе я добавил:

implementation 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'

Мои коды ниже:

MainActivity:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Retrofit retrofit = new Retrofit.Builder().
                baseUrl(APIService.urlBase)
                .addConverterFactory(GsonConverterFactory.create()).
                build();

        APIService service = retrofit.create(APIService.class);
        Call<rocketCatalog> requestModels = service.listCaralog();

        requestModels.enqueue(new Callback<rocketCatalog>() {

            @Override
            public void onResponse(Call<rocketCatalog> call, Response<rocketCatalog> response) {

                rocketCatalog catalog = response.body();

                for (Rockets rocket : catalog.rocket){
                    Log.i(TAG,String.format("%s",rocket.getLaunch_date()));
                }
            }

            @Override
            public void onFailure(Call<rocketCatalog> call, Throwable t) {
                Log.i(TAG,String.format("============= Failure =============="));
            }
        });

        LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);

    }
}

APIService:

public interface APIService {

    public static final String urlBase = "https://api.spacexdata.com/v3/";

    @GET("launches")
    Call<rocketCatalog> listCaralog();

}

rocketКаталог:

public class rocketCatalog {

    public List<Rockets> rocket;

    public List<Rockets> getRocket() {
        return rocket;
    }

    public void setRocket(List<Rockets> rocket) {
        this.rocket = rocket;
    }
}

Ракеты:

public class Rockets {

    String launch_date;

    public String getLaunch_date() {
        return launch_date;
    }

    public void setLaunch_date(String launch_date) {
        this.launch_date = launch_date;
    }
}

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Ваша конечная точка возвращает List, поэтому вам необходим тип List для ответа.

public static final String urlBase = "https://api.spacexdata.com/v3/";

@GET("launches")
Call<List<Rockets>> listCaralog();

также убедитесь, что в ответе есть поле launch_date в вашем классе Rockets.

0 голосов
/ 08 марта 2020

с вашей помощью я выяснил, что происходит.

Действительно, я получал Список, но мне пришлось изменить структуру, я сделал то, что предложил Мохамед Мохсин, и изменил мой rocketCatalog. java на:

rocketCatalog:

String launch_year;

public String getLaunch_year() {
    return launch_year;
}

public void setLaunch_year(String launch_date) {
    this.launch_year = launch_date;
}

}

Кроме того, я изменил "launch_date", которая была неправильной, на "launch_year"

Большое спасибо опять!

...