まあ、私はREST APIレスポンスを使ってFirebaseレスポンスに苦労しています。私はFirebase用のAndroidのlibを使いたくない代わりに、生の残りのAPIを使用したいと思っています。かいつまんで、Firebaseからの応答は次のとおりです。firebaseからの情報の取得とRESTを使用したRetrofitとRxJavaの解析に関する問題
{
"object1": {
"param1": true,
"param2": "05",
"param3": "String",
},
"object2": {
"param1": true,
"param2": "09",
"param3": "String",
}
}
レトロフィットインタフェース:
public interface ApiCalls {
@GET("/objects.json")
Observable<List<MyObject>> getObjects();
}
Gsonビルダー、レトロフィットBuilderとRxJava:
Gson gson = new GsonBuilder()
.setLenient()
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://my-service.firebaseio.com")
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.client(okHttpClient)
.build();
ApiCalls api = retrofit.create(ApiCalls.class);
rx.Observable<List<MyObject>> call2 = api.getObjects();
call2.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<MyObject>>() {
@Override
public void onCompleted() {
Log.d("onCompleted", "Its completed");
}
@Override
public void onError(Throwable e) {
Log.d("onError", e.getMessage());
}
@Override
public void onNext(List<MyObject> MyObjects) {
Log.d("onNext", "NextItem");
}
});
これを実行すると、私は取得エラー:
java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
サーバから来るオブジェクトのリストを反復するためにRxJavaを使ってこれを解決する方法はありますか?以来、私は配列を期待していますが、firebaseの応答は配列ではありませんが、これを解決するにはどうしていますか?私はそれが仕事を始めたレスポンスの期待値を修正した後
@VeereshCharantimath that is indeed the cause of the error: the JSON from Firebase is a map (Map), not a list. Care to post an answer? – Frank van Puffelen
:
レトロフィットAPIは
public interface ApiCalls {
@GET("/objects.json")
Observable<HashMap<String, MyObject>> getObjects();
}
を呼び出し
受信JSONのルート要素が配列でない場合は、オブジェクトです –
試してみてください - Observable
あなたのJSONを投稿する............... – sushildlh