2016-11-23 4 views
2

まあ、私は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(); 
} 

を呼び出し

+2

受信JSONのルート要素が配列でない場合は、オブジェクトです –

+0

試してみてください - Observable getObjects(); –

+0

あなたのJSONを投稿する............... – sushildlh

答えて

2

さて、このコメントのおかげで、私はこの問題を解決することができ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"); 
      } 
     }); 
関連する問題