2017-05-07 4 views
0

Trips.jsonネストされたJSONとレトロフィットflatMap

{ 
    "trips":[ 
     { 
     "summary": { 
      "subTrips":3, 
      "changes":1, 
      "duration":"1:09", 
      "departure":{ 
       "date":"2017-05-07", 
       "time":"11:46", 
      }, 
      "arrival":{ 
       "date":"2017-05-07", 
       "time":"12:55", 
      }, 
     }, 
     "subTrips":[ 
      { 
       "departure":{ 
        "date":"2017-05-07", 
        "time":"11:46", 
       }, 
       "arrival":{ 
        "date":"2017-05-07", 
        "time":"12:07", 
       }, 
       "intermediateStopsKey":"c474e7c" 
      }, 
      { 
       "departure":{}, 
       "arrival":{}, 
       "intermediateStopsKey":"c81e728" 
      } 
     ] 
     }, 
     { 
     "summary": {}, 
     "subTrips": [ 
      { "intermediateStopsKey": "123456" } 
     ] 
     } 
    ] 
} 

IntermediateStops.json

{ 
"status": 1, 
    "data": [ 
     { 
      "stationName": "Husby", 
      "arrivalTime": "19:59", 
      "departureTime": "19:59", 
     }, 
     { 
      "stationName": "Kista", 
      "arrivalTime": "20:01", 
      "departureTime": "20:01" 
     }, 
     { 
      "stationName": "Hallonbergen", 
      "arrivalTime": "20:05", 
      "departureTime": "20:05" 
     } 
    ] 
} 

私の最初のAPIコールはTrips.jsonを返します。 subTripsに複数のフィールドが含まれています。各intermediateStopsKeyは、Trips.jsonに注入する必要があるIntermediateStops.jsonを取得するための新しいAPI呼び出しです。 flatMap()はそれを行う方法と思われますが、私は望む結果を得るためにコマンドを連鎖させる方法を助ける必要があります。

API().getTrips(params) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .doOnRequest((Long request) -> dummyView.setVisibility(View.VISIBLE)) 
       .doOnCompleted(() -> createListView()) 
       .doOnNext(response -> getTrips(response.body().getData())) 
       .flatMap(getTripsModel -> Observable.from(getTripsModel.body().getData().getTrips())) 
       .flatMap(tripsModel -> Observable.from(tripsModel.getSubTrips())) 
       /******** 
       ** at some point here I need to insert the 
       ** IntermediateStops into the SubTripsModel 
       *********/ 
       .flatMap(subTripsModel -> 
        API().getIntermediateStops(
         subTripsModel.getIntermediateStops(), 
         Token.getInstance().TOKEN)) 
       .doOnCompleted(() -> dummyView.setVisibility(View.GONE)) 
       .subscribe(intermediateResponse -> { 
       }, throwable -> { 
        Log.i("REST ERROR", RestErrorHelper.getErrorMessage(throwable, mContext)); 
       }); 

要求が適切にチェーンされている、私は私のgetIntermediateStopsのAPIの結果を挿入する方法についてはわからないよ。この作品

答えて

0
API().getTrips(params) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .doOnRequest((Long request) -> dummyView.setVisibility(View.VISIBLE)) 
       .doOnNext(response -> getTrips(response.body().getData())) 
       .doOnCompleted(() -> createListView()) 
       .flatMap(getTripsModel -> Observable.from(getTripsModel.body().getData().getTrips())) 
       .flatMap(tripsModel -> Observable.from(tripsModel.getSubTrips())) 
       .map((SubTripsModel subTripsModel) -> API().getIntermediateStops(
         subTripsModel.getIntermediateStops(), Token.getInstance().TOKEN) 
         .observeOn(AndroidSchedulers.mainThread()) 
         .subscribe(new Subscriber<Response<BaseResponseModel<List<IntermediateStopsModel>>>>() { 
          @Override 
          public void onCompleted() { 

          } 

          @Override 
          public void onError(Throwable e) { 

          } 

          @Override 
          public void onNext(Response<BaseResponseModel<List<IntermediateStopsModel>>> baseResponseModelResponse) { 
           subTripsModel.setIntermediateStation(baseResponseModelResponse.body().getData()); 
          } 
         })) 
       .doOnCompleted(() -> dummyView.setVisibility(View.GONE)) 
       .subscribe(finalResponse -> { 


       }, throwable -> { 
        Log.i("REST ERROR", RestErrorHelper.getErrorMessage(throwable, mContext)); 
       }); 

それぞれSubTripsModelsに呼び出して、興味がある人のために、あなたはflatMap()への使用入れ子にされたJSONをより深く理解し、subTripsオブジェクトの配列を繰り返し処理できるポイントに達すると、map()関数を使用し、subscribe()を使用すると、subTripを繰り返し処理し、そこにいる。