You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何使用Volley库将数组作为请求体发送给Web服务?

如何用Volley发送JSON数组作为请求体

嘿,我明白你现在的需求——之前用Volley发单个JSON对象没问题,现在要发一组用户数据的数组对吧?别担心,咱们稍微改改代码就能搞定。

首先得说清楚:Volley自带的JsonObjectRequest是专门用来处理JSON对象请求体的,而JsonArrayRequest主要是用来接收JSON数组响应的,没法直接用来发送JSON数组作为请求体。所以咱们得自定义一个Request类来处理这个场景。

下面是修改后的完整代码,我给你标清楚了关键改动:

String url = "你的接口地址";
try {
    // 1. 先构建你要发送的JSON数组
    JSONArray jsonArray = new JSONArray();
    
    // 添加第一个对象
    JSONObject obj1 = new JSONObject();
    obj1.put("name", "a");
    obj1.put("family", "f");
    jsonArray.put(obj1);
    
    // 添加第二个对象
    JSONObject obj2 = new JSONObject();
    obj2.put("name", "b");
    obj2.put("family", "f");
    jsonArray.put(obj2);
    
    // 添加第三个对象
    JSONObject obj3 = new JSONObject();
    obj3.put("name", "c");
    obj3.put("family", "f");
    jsonArray.put(obj3);

    // 2. 自定义Request类,处理JSON数组请求体
    Request<JSONObject> jsonArrayRequest = new Request<JSONObject>(Request.Method.POST, url, 
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        }) {
        @Override
        protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
            try {
                // 解析响应成JSONObject(如果你的接口返回JSON数组,就改成JSONArray)
                String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
                return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response));
            } catch (Exception e) {
                return Response.error(new ParseError(e));
            }
        }

        @Override
        protected void deliverResponse(JSONObject response) {
            // 在这里处理成功响应的逻辑
            // 比如你原来的onResponse里的代码可以移到这里
        }

        @Override
        public byte[] getBody() throws AuthFailureError {
            // 把JSON数组转成字节数组,作为请求体发送
            try {
                return jsonArray.toString().getBytes("utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return null;
            }
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            // 保持原来的Header设置,确保Content-Type正确
            Map<String, String> params = new HashMap<>();
            params.put("Content-Type", "application/json; charset=utf-8");
            return params;
        }
    };

    // 3. 添加请求到Volley队列
    Volley.newRequestQueue(Activity_Goods_List.this).add(jsonArrayRequest);

} catch (Exception e) {
    Toast.makeText(getApplicationContext(), e.getMessage().toString(), Toast.LENGTH_LONG).show();
}

关键要点说明:

  • 自定义Request:因为Volley没有直接支持发送JSON数组的Request,所以我们继承基础的Request类,重写getBody()方法来返回JSON数组的字节形式。
  • 响应解析:parseNetworkResponse方法里我默认解析成JSONObject,如果你的接口返回的是JSON数组响应,只需要把这里改成new JSONArray(jsonString),同时把Request的泛型改成JSONArray就行。
  • Header设置:一定要保留Content-Type为application/json,否则服务端可能无法正确解析你的请求体。

如果你的响应确实是JSON数组,那修改后的请求泛型和解析部分应该是这样:

Request<JSONArray> jsonArrayRequest = new Request<JSONArray>(Request.Method.POST, url, 
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    }) {
    @Override
    protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            return Response.success(new JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response));
        } catch (Exception e) {
            return Response.error(new ParseError(e));
        }
    }

    @Override
    protected void deliverResponse(JSONArray response) {
        // 处理JSON数组响应的逻辑
    }

    // 其他方法(getBody、getHeaders)保持不变
};

这样就能完美实现发送JSON数组作为请求体的需求啦!

内容的提问来源于stack exchange,提问作者matin matini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:19:27