我正在用Volley发送JSONArray GET请求,并且它返回指定的JSON数组。这是我的要求:
JsonArrayRequest getRequest = new JsonArrayRequest(url, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { Log.d("Response", response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("Error.Response", error.toString()); } } ); VolleySingleton.getInstance(this).addToRequestQueue(getRequest); //Call to get dashboard feed }
如您所见,我目前正在注销响应。我想解析数组,并在列表视图中显示结果。这方面的文档并不出色,就Android开发人员而言,我还是很环保的。从Volley解析JSON数组并将结果显示在列表视图中的正确方法是什么?我已经聚集了我应该使用parseNetworkResponse,但是不确定如何实现。
parseNetworkResponse
我建议坚持使用GSON库进行JSON解析。这是带有嵌入式JSON处理的Volley请求的外观:
import java.io.UnsupportedEncodingException; import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; import com.android.volley.toolbox.HttpHeaderParser; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; /** * Volley GET request which parses JSON server response into Java object. */ public class GsonRequest<T> extends Request<T> { /** JSON parsing engine */ protected final Gson gson; /** class of type of response */ protected final Class<T> clazz; /** result listener */ private final Listener<T> listener; public GsonRequest(String url, Class<T> clazz, Listener<T> listener, ErrorListener errorListener) { super(Method.GET, url, errorListener); this.clazz = clazz; this.listener = listener; this.gson = new Gson(); } @Override protected void deliverResponse(T response) { listener.onResponse(response); } @Override protected Response<T> 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)); } } }
假设您有一个位于http://example.com/api/persons/的服务器方法,该方法返回一个Person的JSON数组;人如下:
public class Person { String firstName; String lastName; }
我们可以这样调用上述方法:
GsonRequest<Person[]> getPersons = new GsonRequest<Person[]>("http://example.com/api/persons/", Person[].class, new Listener<Person[]>() { @Override public void onResponse(Person[] response) { List<Person> persons = Arrays.asList(response); // TODO deal with persons } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO deal with error } }); VolleyQueue.get().add(getPersons);
最后,在响应侦听器中,我们获得了一个Person数组,可以将其转换为list并提供给ListView的适配器。