簡體   English   中英

android / java-解析不同結構的JSON響應

[英]android/java - Parsing JSON responses of different structure

我有REST Web服務,它具有不同的響應,其中包含一些這樣的用戶信息

{"id": 1,"fullname": "NV","login": "bravenewuser","sex": "M","mail":"aaa@gmail.com","photo": "","status": "","birthDate": "1900-01-11T00:00:00Z","registrationDate": "1900-05-13T00:00:00Z","phoneNumber": "9010"}

像這樣

[{"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"}]

包含用戶的收聽列表

說我有兩個類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(); } 

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

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

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);
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM