当前位置: 首页 > 知识库问答 >
问题:

使用REST从firebase检索信息并使用Reformation和RxJava进行解析时出现问题

柳绪
2023-03-14

我一直在努力使用REST API响应处理Firebase响应。问题是我不想在Firebase中使用Android的libs,而是使用原始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、改装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的响应不是数组,是否有任何方法可以解决这个问题?

共有1个答案

羊毅庵
2023-03-14

好吧,多亏了这句话,我可以解决这个问题:

@VeereshCharantimath这确实是错误的原因:Firebase中的JSON是一个地图(Map),而不是列表。想发布答案吗?-Frank van Puffelen

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

改装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");
            }
        });
 类似资料:
  • 根据这篇博文,我读过更好的方法是用parcelable而不是seralisable解析http://blog.robinchutaux.com/blog/a-smart-way-to-use-retrofit/ 但是如何使用Parceler库(https://github.com/johncarl81/parceler)自定义解析? 在GSON库中,我们可以这样做: 并像这样配置GsonBuild

  • 我有Byte Buddy作为代理运行,它成功地拦截了我的绝大多数代码库,顺便说一下,这是相当大的!虽然有几个异常值,我不能测量,我在下面记录,希望你能知道答案! 1.CGLIB生成的类 Spring生成了一些额外的类,它们与我的类同名,但在末尾附加了,这些会导致错误。我得到的错误是: 2.打包私密类和私密类 我看到的另一个问题是检测或。 代码如下所示: Byte Buddy instrument或

  • 我正在做一个项目,从firebase(它是“排队的”)中提取数据。本质上,数据是以W/a时间戳的方式保存的,因此当调用数据时,可以按顺序排序(先进先出)。 我面临的问题是当我在我的应用程序上检索数据。根据我的研究,在堆栈溢出和firebase文档中,.value提供一个快照,并在添加新数据时继续监听数据。然而,当添加新数据时,它将获得整个集合的新快照(因此在我的应用程序数组上“复制数据”)。

  • 我目前正在做一个优惠券项目。在处理我的facade类时,我遇到一个问题,通过使用外键从表中输入客户的ID来获取客户已购买的优惠券列表。 我使用的方法是: 优惠券类别: 调用方法: 我的SQL表: Coupon_vs_Customer表仅包含2行。它们都是其他表的外键。CustomerID连接到“Customers”表,而coupon_ID连接到表“Coupons” 正如您在上面看到的,ID为1的客

  • 我正试图从以下网站“url=”上抓取内容https://angel.co/life-sciences' ". 该网站包含8000多个数据。从这个页面我需要像公司名称和链接,加入日期和追随者的信息。在此之前,我需要通过单击按钮对followers列进行排序。然后单击“更多隐藏”按钮加载更多信息。页面最多可点击20次(隐藏更多)内容,此后不会加载更多信息。但我只能通过排序来获取顶级追随者的信息。这里我

  • 我正在使用AWS Java SDK v2列出使用AWS GitHub repo中定义的代码的用户。 它为。下面是上面代码中print语句的输出。 当我在AWS控制台上的AWS CloudShell中运行以下命令时,它将返回所定义用户的PermissionBoundary。