【问题标题】:Parse Android Volley JSONArray response解析 Android Volley JSONArray 响应
【发布时间】:2014-06-25 05:50:10
【问题描述】:

我正在使用 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 数组并在列表视图中显示结果的正确方法是什么? I've gathered 我应该使用parseNetworkResponse,但不知道如何实现。

【问题讨论】:

    标签: java android json android-volley


    【解决方案1】:

    我建议坚持使用 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/ 的服务器方法,它返回一个 JSON 数组 Person;人物如下:

    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 数组,可以将其转换为列表并馈送到 ListView 的适配器。

    【讨论】:

    • 最后一个代码sn-p去哪儿了? VolleyQueue 是在哪里定义的?
    • 这里可以使用type token方法吗?
    • 很好的样本。它有帮助。!
    • @Greg 试试这样 VolleyHelper.getInstance(getActivity()).addToRequestQueue(getPersons);创建一个 volley helper 类来添加请求队列。如果您需要我可以提供的样品!。
    【解决方案2】:

    您可以使用Gson 项目在 java 和 android 应用程序中使用 json,非常简单 此链接是使用 gson 的示例链接

    How To Convert Java Object To / From JSON (Gson)

    【讨论】:

      【解决方案3】:

      您可以在android框架中使用本机JSONParsor,您的要求相对较少,JSON 简单Here 是教程的链接。

      但如果您使用 complex JSON 对象,请使用类似

      的库
      • GSON
      • 杰克逊

      我发现 GSON 更易于使用且更有效。您可以通过Here了解更多信息

      【讨论】:

      • 谢谢,我可能会使用 GSON。你能详细说明如何实际解析一个数组吗?您引用的示例使用 AsyncTask,而不是 Volley,因此有点令人困惑。我发现解析 JSONObject 有很多资源,但对于我正在处理的数组而言,资源却不多。
      • 将响应字符串从volley 传递给gson
      猜你喜欢
      • 1970-01-01
      • 2019-08-28
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多