RxJava2 和 Retrofit2:预期为 BEGIN_ARRAY 但在第 1 行第 2 列路径为 BEGIN_OBJECT $
RxJava2 and Retrofit2 : Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
我一直在尝试如何使用 RxJava2 和 Retrofit 2 来使用 Github API .尝试访问 link :
<https://api.github.com/search/repositories?q=topic:ruby+topic:rails>
。我想显示 NAME 和 NODE_ID。但是一直卡在错误中:
java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ .
这是 客户端 class 用于 Retrofit。
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);
}
});
该问题与RxJava 无关。您的数据模型有问题:
Observable<List<itemsClass>>
- 您期待实体列表出现,但实际上您的 json 是具有字段 total_count
、incomplete_results
和实际列表字段 items
的(显然)itemsClass
。请在Observable<...> getAllUsers();
界面方法下使用正确的模型。
您得到的响应不是数组。
使用 json 转换器时(在您的情况下是 gson),响应必须与 POJO 完全匹配。
您可以将 itemClass
换成另一个 class,例如 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 转换 items 数组。
Type typeToken = new TypeToken<List<itemClass>>() {}.getType();
List<itemClass> items = new Gson().fromJson(response.get("items"), typeToken);
我一直在尝试如何使用 RxJava2 和 Retrofit 2 来使用 Github API .尝试访问 link :
<https://api.github.com/search/repositories?q=topic:ruby+topic:rails>
。我想显示 NAME 和 NODE_ID。但是一直卡在错误中:
java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ .
这是 客户端 class 用于 Retrofit。
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);
}
});
该问题与RxJava 无关。您的数据模型有问题:
Observable<List<itemsClass>>
- 您期待实体列表出现,但实际上您的 json 是具有字段 total_count
、incomplete_results
和实际列表字段 items
的(显然)itemsClass
。请在Observable<...> getAllUsers();
界面方法下使用正确的模型。
您得到的响应不是数组。
使用 json 转换器时(在您的情况下是 gson),响应必须与 POJO 完全匹配。
您可以将 itemClass
换成另一个 class,例如 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 转换 items 数组。
Type typeToken = new TypeToken<List<itemClass>>() {}.getType();
List<itemClass> items = new Gson().fromJson(response.get("items"), typeToken);