2017-10-08 76 views
0

的JSON響應我有了包含這樣的Android/JAVA - 解析不同結構

{"id": 1,"fullname": "NV","login": "bravenewuser","sex": "M","mail":"[email protected]","photo": "","status": "","birthDate": "1900-01-11T00:00:00Z","registrationDate": "1900-05-13T00:00:00Z","phoneNumber": "9010"} 

一些用戶信息的不同反應REST Web服務,這樣

[{"id":2,"userId":0,"timeStart":"2017-08-21T13:05:00Z","active":true,"title":"Woman","artist":"Wolfmother","length":"00:04:00"},{"id":1,"userId":0,"timeStart":"2017-08-20T13:05:34Z","active":true,"title":"Dont call","artist":"Royal blood","length":"00:03:20"}] 

與用戶的listenings名單

說我有兩個類UserListening(可能另外我需要ListOfListenings包裝類)。可能將來我想從服務中獲取更多信息並獲得具有其他結構的響應。

問題是什麼是在代碼的一個地方(方法或類)解析不同響應的最佳方式是什麼?

我使用com.loopj.android.http.AsyncHttpClient來撥打服務。所以,我可以嘗試這樣的事情:

  1. 寫一個共同的響應處理針對不同類型的反應:

    public class CommonResponseHandler <T extends Entity> extends AsyncHttpResponseHandler { 
        private T response; 
    
        public T getResponse() { 
         return this.response; //return pasing result 
        } 
    
        @Override 
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 
         /*parsing response body into this.response*/ 
        } 
    
        @Override 
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { 
         ///... 
        } 
    } 
    
  2. ,然後調用服務這樣

    public User getUser(String url, RequestParams someparams) { 
        AsyncHttpClient client = new AsyncHttpClient(); 
        CommonResponseHandler<User> handler = new CommonResponseHandler<>(); 
        client.get(url, someparams, handler); 
        return handler.getResponse(); 
    } 
    

我可以通過這種方式簡化解析不同類型的響應嗎?如果不是,解決這個問題有什麼更好的(甚至是最好的)方法?謝謝。

回答

1

您需要兩個響應處理程序。

public class ObjectResponseHandler <T extends Entity> extends AsyncHttpResponseHandler { 
    private T response; 

    public T getResponse() { 
     return this.response; //return pasing result 
    } 
} 

而且,

public class ArrayResponseHandler <T extends Entity> extends AsyncHttpResponseHandler { 
    private List<T> responses; 

    public List<T> getResponses() { 
     return this.responses; //return pasing result 
    } 
} 

而且,如果你的JSON只會是一個JsonArray或JSONObject的。你可以檢查它使用

anyJsonString.startsWith("[") => true => use ArrayResponseHandler 
anyJsonString.startsWith("{") => true => use ObjectResponseHandler 

。如果你想使用的GetResponse()爲對象,以保持,你應該像

public class ListWrapper<T> { 

    List<T> list; 

    public ListWrapper (List<T> list) { this.list = list; } 

    public List<T> getList() { return list; }   

} 

創造的東西而且,在ArrayResponseHandler使用它,就像

public ListWrapper getResponse() { 
    return new ListWrapper<T>(responses); 
} 
+0

看起來像完美的答案。 –

+0

謝謝你的回答。 @rupinderjeet –