2017-06-07 5 views
0

Ich möchte JSON-Ausgabe von Rest Anruf basierend auf dem Status verarbeiten. Was wird der erforderliche Ansatz sein?Behandeln Sie den Status von JSON durch Retrofit-Aufruf

Hier ist meine Methode von RetrofitApi Klasse

@POST("KeepHoldTisConfirmation") 
Observable<ResultOutput> putHoldTis(@Body ResultOutput body); 

Hier meine MyObject-Klasse Struktur ist

public int filterId; 
public String type; 

Hier meine ResultOutput Klasse Struktur

public int status; 
public List<MyObject> data; 

Wenn Erfolg meines JSON Ausgang : -

{"status":1,"data":[{"filterId":1,"type":"flower"},{"filterId":2,"type":"sand"}]} 

Wenn Fehler meine JSON Ausgabe lautet: -

{"status":2,"data":"Invalid key"} 

Hier ist mein beobachtbare Code: -

Observable.fromIterable(entities) 
       .filter(tisEntity -> "1".equals(tisEntity.isTisHold)) 
       .concatMapEager(tisEntity -> { 
        Log.d(TAG,"insert = "+tisEntity.hitachiCode); 
        return hitachiRetrofitApi.putHoldTis(new TisHoldEntity(tisEntity.projectId, tisEntity.holdReason, "76800", 
         tisEntity.holdComment,tisEntity.hitachiCode, 1));}) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribeWith(new DisposableObserver<ResultOutput>() { 

        @Override 
        public void onNext(ResultOutput responseBody) { 
         // handle here status and accordingly process output 
        } 

        @Override 
        public void onError(Throwable e) { 
         e.printStackTrace(); 
         cancleProgressDialog(); 
        } 

        @Override 
        public void onComplete() { 

         Log.d(TAG, "on complete for entity"); 
         updateTisDetails(); 
        } 
       }); 

hier, was soll ich in OnNext schreiben()?

+0

was ist das gewünschte Verhalten ? was ist falsch mit einfach wenn am onNext()? Möchten Sie Ausnahmen mit Fehlerstatus auslösen? – yosriz

+0

Ich möchte ResultOutput als die gewünschte json-Ausgabe, es ist nur möglich, wenn Status 1 ist, wenn Status 2 ist, schlägt es fehl – user2582324

Antwort

0

Sie können eine Bohne wie dieser

classe Result { 
    public int status; 
    public String data; 
} 

Erste Weg bauen analysieren, um die json von responseBody.body() string().

Zweiter Weg machen RetrofitApi Klasse

@POST("KeepHoldTisConfirmation") 
Observable<Result> putHoldTis(@Body ResultOutput body); 

OnNext die Result.data zu analysieren.

Ein anderer Weg, machen ConverterFactory Klasse

public final class ConverterFactory<T> extends Converter.Factory { 

    @Override 
    public Converter<ResponseBody, ?> responseBodyConverter(final Type type, Annotation[] annotations, 
     final Retrofit retrofit) { 
    return new Converter<ResponseBody, T>() { 

     @Override 
     public T convert(ResponseBody value) throws IOException { 
     String origin = value.string(); 

     try { 
      Result response = JSON.parseObject(origin, Result.class); 
      if (response.status == 1) { 
       return JSON.parseObject(response.data, type); 
      } else { 
       throw new HttpException(Response.error(2, value)); 
      } 
     } finally { 
      value.close(); 
     } 
     } 
    }; 
    } 
    ... 
} 

Wenn Build Retrofit der Fabrik

new Retrofit.Builder().addConverterFactory(ConverterFactory.create()); 

Dann fügen Sie den Fehler in OnError verarbeiten kann()

@Override 
public void onError(Throwable e) { 
    if (e != null && e instanceof HttpException) { 
     HttpException exception = (HttpException) e; 
     int code = exception.code(); 
     Response response = exception.response(); 
     String error = null; 
     if (null != response && null != response.errorBody()) {  
      Result response = JSON.parseObject(origin, Result.class); 
      error = response.data 
     } 
    } 
} 
Verwandte Themen