的Android/JAVA - 解析不同结构
问题描述:
的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名单
说我有两个类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) { ///... } }
-
,然后调用服务这样
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);
}
看起来像完美的答案。 –
谢谢你的回答。 @rupinderjeet –