我有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
来拨打服务。所以我可以尝试这样的事情:
为不同类型的响应编写一个通用响应处理程序:
com.loopj.android.http.AsyncHttpClient
然后像这样调用服务
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) {
///...
}
}
我可以通过这种方式简化解析不同类型的响应。如果没有,解决这个问题的更好(甚至是最好的)方法是什么?谢谢。
答案 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);
}