Я пробовал работать с 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);
}
});
Проблема не имеет ничего общего с 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();
@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);