【问题标题】:Problems retrieving info from firebase and parsing with Retrofit and RxJava using REST使用 REST 从 firebase 检索信息和使用 Retrofit 和 RxJava 解析时出现问题
【发布时间】:2017-04-07 01:08:36
【问题描述】:

嗯,我一直在为使用 REST API 响应的 Firebase 响应而苦苦挣扎。问题是我不想将 Android 的库用于 Firebase,而是使用原始的 rest api。长话短说,Firebase 的回应是:

{
    "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、Retrofit 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的响应不是一个数组,有没有办法解决这个问题?

【问题讨论】:

  • 传入 JSON 的根元素不是数组,而是对象
  • 尝试使用 - Observable getObjects();
  • 发布您的 JSON ......
  • 这个问题与 RxJava 无关,您发布的消息说您正在尝试将 jsonObject 结构反序列化为 JsonArray。
  • @VeereshCharantimath 这确实是错误的原因:来自 Firebase 的 JSON 是地图 (Map&lt;String,Object&gt;),而不是列表。愿意发布答案吗?

标签: android rest firebase retrofit rx-android


【解决方案1】:

嗯,多亏了这条评论,我可以解决这个问题:

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

在我修改了响应的预期值后,它开始起作用了:

改造 API 调用

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

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");
            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    相关资源
    最近更新 更多