如何解析android volley gson请求到列表/对象集合
我正在尝试使用android排球发出Gson请求。 目前它正常工作,我很高兴。 但是,为什么我尝试获取List 或对象集合,我的代码不再有效。
当前代码:
public class ReviewModel { public long Id; public Strring Description; }
这是我如何使用我的gson类:
GsonRequest jsObjRequest = new GsonRequest(Request.Method.GET, url, ReviewModel.class, new Response.Listener() { @Override public void onResponse(ReviewModel response) { ReviewsHandleOkResponse(response); } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { ReviewsHandleErrorResponse(error); } }); Network.getInstance(getActivity()).addToRequestQueue(jsObjRequest); }
这是我的Volley GSON请求类:
public class GsonRequest extends Request { private final Gson gson = new Gson(); private final Class clazz; private final Map headers; private final Map params; private final Listener listener; /** * Make a GET request and return a parsed object from JSON. * * @param url * URL of the request to make * @param clazz * Relevant class object, for Gson's reflection * @param headers * Map of request headers */ public GsonRequest(int method, String url, Class clazz, Map headers, Map params, Listener listener, ErrorListener errorListener) { super(method, Network.getFullUrl(url), errorListener); this.clazz = clazz; this.headers = headers; this.params = params; this.listener = listener; } /** * Recieves header * * @param method * @param url * @param clazz * @param params * @param listener * @param errorListener */ public GsonRequest(int method, String url, Class clazz, Map params, Listener listener, ErrorListener errorListener) { super(method, Network.getFullUrl(url), errorListener); this.clazz = clazz; this.headers = new HashMap(); this.params = params; this.listener = listener; } /** * No params or headers * * @param method * @param url * @param clazz * @param listener * @param errorListener */ public GsonRequest(int method, String url, Class clazz, Listener listener, ErrorListener errorListener) { super(method, Network.getFullUrl(url), errorListener); this.clazz = clazz; this.headers = new HashMap(); this.params = new HashMap(); this.listener = listener; } @Override public Map getHeaders() throws AuthFailureError { return headers != null ? headers : super.getHeaders(); } @Override public Map getParams() throws AuthFailureError { return params != null ? params : super.getParams(); } @Override protected void deliverResponse(T response) { listener.onResponse(response); } @Override protected Response parseNetworkResponse(NetworkResponse response) { try { String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JsonSyntaxException e) { return Response.error(new ParseError(e)); } } }
但是,当我将它重新解析并解析为List
我得到了编译错误。
根据我的研究,我需要做一些事情:
Type collectionType = new TypeToken<ArrayList>(){}.getType(); // api/v1/reviews/products/{productId}/{pageNumber}/{pageSize} String url = "api/v1/reviews/products/" + productId + "/" + currentPage + "/" + pageSize; GsonRequest<ArrayList> jsObjRequest = new GsonRequest<ArrayList>(Request.Method.GET, url, (Class<ArrayList>) collectionType, new Response.Listener<ArrayList>() { @Override public void onResponse(ArrayList response) { ReviewsHandleOkResponse(response); } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { ReviewsHandleErrorResponse(error); } }); Network.getInstance(getActivity()).addToRequestQueue(jsObjRequest); }
但这给了我以下错误:
10-28 21:12:59.940:E / AndroidRuntime(28564):java.lang.RuntimeException:无法启动活动ComponentInfo {com.menu/com.menu.activities.ProductViewActivity}:java.lang.ClassCastException:com.google .gson.internal。$ Gson $ Types $ ParameterizedTypeImpl无法强制转换为java.lang.Class
我是否需要修改我的GsonRequest类,并添加另一个不带类型类的构造函数?
使用YourClass[]
获取Volley请求中的对象列表。 它解决了我的问题。 以下代码可以帮助您:
GsonRequest jsObjRequest = new GsonRequest(Request.Method.GET, url, ReviewModel[].class, new Response.Listener() { @Override public void onResponse(ReviewModel[] response) { ReviewsHandleOkResponse(response); } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { ReviewsHandleErrorResponse(error); } }); Network.getInstance(getActivity()).addToRequestQueue(jsObjRequest); }
我最近需要自己实施一个解决方案,所以你去吧。 自定义GsonArrayRequest。
public class GsonArrayRequest extends Request> { private final Gson gson = new Gson(); private final Class clazz; private final Map headers; private final Response.Listener> listener; /** * Make a GET request and return a parsed object from JSON. * @param clazz Relevant class object, for Gson's reflection * @param url URL of the request to make * @param headers Map of request headers */ public GsonArrayRequest(String url, Class clazz, Map headers, Response.Listener> listener, Response.ErrorListener errorListener) { super(Method.GET, url, errorListener); this.clazz = clazz; this.headers = headers; this.listener = listener; } @Override public Map getHeaders() throws AuthFailureError { return headers != null ? headers : super.getHeaders(); } @Override protected Response> parseNetworkResponse(NetworkResponse response) { try { String json = new String( response.data, HttpHeaderParser.parseCharset(response.headers)); Type listType = com.google.gson.internal.$Gson$Types.newParameterizedTypeWithOwner(null, ArrayList.class, clazz); ArrayList tList = gson.fromJson(json, listType); return Response.success( tList, HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JsonSyntaxException e) { return Response.error(new ParseError(e)); } } @Override protected void deliverResponse(ArrayList response) { listener.onResponse(response); } }
你可以像这样使用它:
GsonArrayRequest gsonArrayRequest = new GsonArrayRequest<>( url, AngryPugs.class, null, new Response.Listener>() { @Override public void onResponse(ArrayList response) { // your list here } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } });
添加请求后
VolleySingleton.getInstance(this).addToRequestQueue(gsonArrayRequest);
- 如何在从Unity调用的Java插件中创建Android Handler
- Gradle Build失败并出现exception:java.exe’以非零退出值2结束
- java.text.ParseException:仅限某些设备上的无法解析的日期
- Android从AsyncTask调用notifyDataSetChanged
- setBackgroundResource不设置图像
- 使用ArrayList 和扩展Parcelable的类
- 设置LayoutParams 时出现NullPointerException
- 如何使用Android上的Jackson将JSON数组解析为不同的对象?
- 如何将json代码放入我的应用程序