如何用Volley库在JsonArray中存入多个JsonObject及服务端ArrayList转JsonArray
关于Volley客户端与服务端JSON数组处理的解决方案
刚好之前做过类似的需求,我来给你详细解答这两个问题:
问题1:如何使用Volley库将多个JsonObject放入JsonArray中?
其实步骤很清晰,先逐个构建JsonObject,再把它们添加到JsonArray里,最后通过Volley发送请求就行。这里给你完整的代码示例,完全贴合你给出的参数格式:
import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.Volley; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.content.Context; import android.util.Log; // 在你的Activity或Fragment中调用 public void sendMultiJsonObjectRequest(Context context) { // 1. 初始化空的JsonArray JSONArray jsonArray = new JSONArray(); try { // 2. 创建第一个数据对象并加入数组 JSONObject item1 = new JSONObject(); item1.put("year", "2019"); item1.put("amt", 6222); jsonArray.put(item1); // 3. 创建第二个数据对象并加入数组 JSONObject item2 = new JSONObject(); item2.put("year", "2016"); item2.put("amt", 5555); jsonArray.put(item2); // 4. 把JsonArray包装成服务端需要的请求体(带"list"字段) JSONObject requestBody = new JSONObject(); requestBody.put("list", jsonArray); // 5. 构建Volley请求 JsonObjectRequest request = new JsonObjectRequest( Request.Method.POST, "你的服务端接口地址", requestBody, response -> { // 请求成功后的处理逻辑 Log.d("VolleySuccess", "响应数据:" + response.toString()); }, error -> { // 请求失败后的处理逻辑 Log.e("VolleyError", "请求出错:" + error.getMessage()); } ); // 6. 将请求加入Volley队列 RequestQueue queue = Volley.newRequestQueue(context); queue.add(request); } catch (JSONException e) { // 捕获JSON构造时的异常 e.printStackTrace(); } }
注意事项:
- 一定要捕获
JSONException,因为JSONObject.put()方法可能会抛出异常 - 如果服务端直接接收纯JsonArray,你也可以用
StringRequest发送jsonArray.toString()作为请求体,不过大多数场景下都会像示例这样包装在一个父JsonObject里
问题2:服务端如何将ArrayList放入JsonArray?
我以Java技术栈(比如Spring Boot)为例,给你两种实现方式——手动构造和框架自动序列化:
方式1:手动构造JsonArray(适合非框架场景)
import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; public class ServerJsonHandler { public static void main(String[] args) { // 1. 准备ArrayList数据 List<YearAmt> dataList = new ArrayList<>(); dataList.add(new YearAmt("2019", 6222)); dataList.add(new YearAmt("2016", 5555)); // 2. 初始化JsonArray并逐个添加JsonObject JSONArray jsonArray = new JSONArray(); for (YearAmt item : dataList) { JSONObject jsonObj = new JSONObject(); try { jsonObj.put("year", item.getYear()); jsonObj.put("amt", item.getAmt()); jsonArray.put(jsonObj); } catch (Exception e) { e.printStackTrace(); } } // 3. 包装成带"list"字段的响应对象(可选,根据服务端接口要求) JSONObject response = new JSONObject(); try { response.put("list", jsonArray); } catch (Exception e) { e.printStackTrace(); } // 输出结果就是你需要的格式:{"list":[{"year":"2019","amt":6222},{"year":"2016","amt":5555}]} System.out.println(response.toString()); } // 定义数据实体类 static class YearAmt { private String year; private int amt; public YearAmt(String year, int amt) { this.year = year; this.amt = amt; } // Getter方法 public String getYear() { return year; } public int getAmt() { return amt; } } }
方式2:Spring Boot框架自动序列化(推荐)
如果用Spring Boot开发服务端,根本不用手动构造Json,框架会帮你自动完成序列化:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @RequestMapping("/api") public class DataController { @GetMapping("/getList") public Map<String, List<YearAmt>> getListData() { // 准备ArrayList数据 List<YearAmt> dataList = new ArrayList<>(); dataList.add(new YearAmt("2019", 6222)); dataList.add(new YearAmt("2016", 5555)); // 包装成带"list"字段的响应 Map<String, List<YearAmt>> response = new HashMap<>(); response.put("list", dataList); return response; // 框架会自动序列化为你需要的JSON格式 } // 数据实体类 static class YearAmt { private String year; private int amt; // 构造方法、Getter和Setter(IDE可自动生成) public YearAmt(String year, int amt) { this.year = year; this.amt = amt; } public String getYear() { return year; } public void setYear(String year) { this.year = year; } public int getAmt() { return amt; } public void setAmt(int amt) { this.amt = amt; } } }
这种方式更简洁,避免了手动处理JSON的异常,而且维护起来更方便。
内容的提问来源于stack exchange,提问作者Devanand Adabaile
相关产品推荐
相关产品推荐

