RxJava2 и Retrofit2: ожидалось BEGIN_ARRAY, но было BEGIN_OBJECT в строке 1, столбце 2, пути $

Я пробовал работать с RxJava2 и Модернизация 2, чтобы использовать Github API. Пытаюсь зайти по ссылке: <https://api.github.com/search/repositories?q=topic:ruby+topic:rails>.Я хочу отображать ИМЯ и NODE_ID. Но застряли с ошибкой:

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ .

Вот Класс клиента для Модернизация.

    public class Client {
public static final String GITHUB_BASE_URL = "https://api.github.com/search/";
private static Client instance;
private static GetData data;
public Client() {
    final Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.
            LOWER_CASE_WITH_UNDERSCORES).create();
    final Retrofit retrofit = new Retrofit.Builder().baseUrl(GITHUB_BASE_URL).
            addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(gson)).build();
    data = retrofit.create(GetData.class);
}
public static Client getInstance(){
    if (instance==null)
        instance = new Client();
    return  instance;
}

public Observable<List<itemsClass>> getAllUsers(){
    return data.getAllUsers();
}

интерфейс

    @GET("repositories?q=topic:ruby+topic:rails")
Observable<List<itemsClass>> getAllUsers();        

Данные, которые мне нужны для прохождения вызова, выглядят следующим образом:

    {
     "total_count": 2997,
     "incomplete_results": false,
     "items": [
          {
              "id": 8514,
              "name": "rails",
               "owner": {  
                     "node_id": "MDEyOk9yZ2FuaXphdGlvbjQyMjM = " 
                        },
             }],
     },......     

А также Основная деятельность, откуда я буду отображать данные.

    subscription = Client.getInstance().getAllUsers().
            subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.
            mainThread()).subscribe(new Observer<List<ParentClass>>() {
        @Override
        public void onCompleted() {
            Log.d(TAG,"In completed()");
        }
        @Override
        public void onError(Throwable e) {
            Log.d(TAG,"In onError()");
            Log.d(TAG,""+e);
        }
        @Override
        public void onNext(List<ParentClass> parentClasses) {
            Log.d(TAG,"In onNext()");
            loadData(parentClasses);
        }
    });
0
0
412
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема не имеет ничего общего с RxJava. Это проблема с вашей моделью данных:

Observable<List<itemsClass>> - вы ожидаете, что придет список объектов, но на самом деле ваш json - это объект, который имеет поля total_count, incomplete_results и фактическое поле списка items (очевидно) itemsClass. Пожалуйста, используйте правильную модель в методе интерфейса Observable<...> getAllUsers();.

Ответ принят как подходящий

Ответ, который вы получаете, не является массивом.
При использовании конвертеров json (в вашем случае это gson) ответ должен точно соответствовать POJO.

Вы можете обернуть itemClass другим классом, например responseClass, который будет иметь:

class responseClass {
    int total_count;
    boolean incomplete_results;
    List<itemClass> items;
}

И затем, в клиентском интерфейсе:

@GET("repositories?q=topic:ruby+topic:rails")
Observable<responseClass> getAllUsers();      


Another option is not to use the auto converter, instead you may do:
@GET("repositories?q=topic:ruby+topic:rails")
Observable<JsonObject> getAllUsers();  //com.google.gson.JsonObject  

а затем преобразовать только массив элементов с помощью gson.

Type typeToken = new TypeToken<List<itemClass>>() {}.getType();
List<itemClass> items = new Gson().fromJson(response.get("items"), typeToken); 

Другие вопросы по теме