Problems retrieving info from firebase and parsing with Retrofit and RxJava using REST

And*_*ler 3 rest android firebase retrofit rx-android

Well, I've being struggling with Firebase response using the REST API response. The thing is I don't want to use Android's libs for Firebase and instead use raw rest api. Long story short, the response from Firebase is:

{
    "object1": {
        "param1": true,
        "param2": "05",
        "param3": "String",
    },
    "object2": {
        "param1": true,
        "param2": "09",
        "param3": "String",
    }
}
Run Code Online (Sandbox Code Playgroud)

Retrofit interface:

public interface ApiCalls {
    @GET("/objects.json")
    Observable<List<MyObject>> getObjects();
}
Run Code Online (Sandbox Code Playgroud)

Gson Builder, Retrofit Builder and 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");
                }
            });
Run Code Online (Sandbox Code Playgroud)

When this is executed then I get the error:

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
Run Code Online (Sandbox Code Playgroud)

Is there anyway to solve this using RxJava in order to iterate the list of objects coming from the server? Since now I'm expecting an array but firebase's response is not an array, is there anyway to solve this?

And*_*ler 5

好吧,由于此评论,我可以解决问题:

@VeereshCharantimath确实是错误的原因:Firebase中的JSON是地图(Map),而不是列表。愿意发布答案吗?–弗兰克·范普菲伦

在修改响应的期望值之后,它开始工作:

改装Api呼叫

public interface ApiCalls {
    @GET("/objects.json")
    Observable<HashMap<String, MyObject>> getObjects();
}
Run Code Online (Sandbox Code Playgroud)

RxJava的

rx.Observable<HashMap<String, MyObject>> call2 = api.getObjects();
call2.subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<HashMap<String, 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(HashMap<String, MyObject> MyObjects) {
                Log.d("onNext", "NextItem");
            }
        });
Run Code Online (Sandbox Code Playgroud)