如何解析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);