Я пробовал работать с 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);