RxJava2 и Retrofit2: ожидаемый BEGIN_ARRAY, но был BEGIN_OBJECT в строке 1, путь 2 столбца $ - PullRequest
0 голосов
/ 09 апреля 2019

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

java.lang.IllegalStateException: ожидаемый BEGIN_ARRAY, но был BEGIN_OBJECT в строке 1 пути 2 столбца $.

Вот Класс клиента для Дооснащение .

    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=" 
                        },
             }],
     },......     

А также MainActivity , откуда я буду отображать данные.

    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);
        }
    });

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

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

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

1 голос
/ 09 апреля 2019

Ответ, который вы получите, не является массивом.При использовании преобразователей 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();      


Другой вариант - не использовать автоматический конвертер, вместо этого вы можете сделать:
@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); 
...