android / java - 解析不同结构的JSON响应

时间:2017-10-08 13:53:15

标签: java android json

我有REST Web服务,它有不同的响应,包含一些像这样的用户信息

    if (j > (i / j))
        cout << i << " is " << sum++ << endl;

并且喜欢这个

{"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"}] User(可能另外我需要Listening包装类)。可能在将来我想从服务中检索更多信息并获得具有其他结构的响应。

问题是在代码的一个地方(方法或类)中解析不同响应的最佳方法是什么?

我使用ListOfListenings来拨打服务。所以我可以尝试这样的事情:

  1. 为不同类型的响应编写一个通用响应处理程序:

    com.loopj.android.http.AsyncHttpClient
  2. 然后像这样调用服务

    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) {
            ///...
        }
    }
    
  3. 我可以通过这种方式简化解析不同类型的响应。如果没有,解决这个问题的更好(甚至是最好的)方法是什么?谢谢。

1 个答案:

答案 0 :(得分: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);
 }