简体   繁体   English

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

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

I have REST web service that has different responses containing some user information like this 我有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"}

and like this 像这样

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

with list of user's listenings 包含用户的收听列表

Say I have two classes User and Listening (may be in addition I need ListOfListenings wrapper-class). 说我有两个类UserListening (也许我还需要ListOfListenings包装器类)。 May be in future i would like to retrieve some more information from service and get responses having some another structure. 也许将来我想从服务中获取更多信息,并获得具有其他结构的响应。

The question is what is the best way to parse different responses in one place (method or class) of the code? 问题是在代码的一个位置(方法或类)解析不同响应的最佳方法是什么?

I use com.loopj.android.http.AsyncHttpClient for calling service. 我使用com.loopj.android.http.AsyncHttpClient调用服务。 So can I try something like this: 所以我可以尝试这样的事情:

  1. Write one common response handler for different types of response: 为不同类型的响应编写一个通用的响应处理程序:

     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. and then call service like this 然后像这样打电话给服务

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

Can I simplify parsing different types of responses by this way. 我可以通过这种方式简化对不同类型响应的解析。 And if not, what is better (or even the best) way to solve this problem? 如果没有,解决这个问题的更好(甚至最好)的方法是什么? Thank you. 谢谢。

You need two response handlers. 您需要两个响应处理程序。

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

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

And, 和,

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

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

And, if your JSON is only going to be a JsonArray or JsonObject. 并且,如果您的JSON仅将是JsonArray或JsonObject。 You can check for it using 您可以使用检查

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

If you want to keep using getResponse() as an object, you should create something like 如果您想继续使用getResponse()作为对象,则应创建类似

public class ListWrapper<T> {

    List<T> list;

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

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

}

And, use it in ArrayResponseHandler, like 并且,在ArrayResponseHandler中使用它,例如

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM