如何在Java中获取JavaScript通过Ajax发送的JSONArray数据
解决前端JSON数组传递到Java后端的正确方式
我来帮你搞定这个问题!首先得先理清你当前代码的问题所在:当你用jQuery的Ajax发送data: param时,jQuery默认会把这个对象序列化成表单编码格式(比如objarray[0][itemId]=xxx&objarray[1][itemId]=yyy...),而不是JSON字符串。这就导致后端用request.getParameter("objarray")拿到的是一串无法直接解析的字符串,自然没法转成JSONArray。
下面给你两种可行的解决方案,你可以根据自己的场景选择:
方案一:前端发送JSON字符串,后端解析
这种方式更直接,把整个参数转成JSON字符串发送,后端直接解析成JSON对象。
修改后的JavaScript代码
var priceList = []; priceList.push({"itemId":itemId1,"idElem":idElem1,"isActive":isActive1,"description":description1}); priceList.push({"itemId":itemId2,"idElem":idElem2,"isActive":isActive2,"description":description2}); var param = {'objarray' : priceList, 'user' : user}; // 将参数转为JSON字符串 var jsonParam = JSON.stringify(param); $.ajax({ url : 'cPayment', type: 'POST', contentType: 'application/json', // 必须指定内容类型为JSON data: jsonParam, success: function(result) { alert('SUCCESS'); } });
对应的Java后端代码
这里假设你用的是org.json库(和你代码里的JSONArray/JSONObject对应):
// 先读取整个请求体的JSON字符串 BufferedReader reader = request.getReader(); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line); } String jsonStr = sb.toString(); // 解析成JSONObject JSONObject requestJson = new JSONObject(jsonStr); // 获取objarray对应的JSONArray JSONArray jsonArray = requestJson.getJSONArray("objarray"); // 遍历JSONArray处理每个元素 for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObj = jsonArray.getJSONObject(i); String itemId = jsonObj.getString("itemId"); String idElem = jsonObj.getString("idElem"); boolean isActive = jsonObj.getBoolean("isActive"); String description = jsonObj.getString("description"); // 这里做你的后续处理逻辑 } // 同时可以获取user参数 String user = requestJson.getString("user");
方案二:保持前端现有发送方式,后端解析表单编码的数组
如果你不想改前端代码,也可以直接解析jQuery生成的表单格式参数:
Java后端代码(无需修改前端)
// 获取objarray下的所有itemId参数,格式是objarray[0][itemId], objarray[1][itemId]等 String[] itemIds = request.getParameterValues("objarray[][itemId]"); String[] idElems = request.getParameterValues("objarray[][idElem]"); String[] isActives = request.getParameterValues("objarray[][isActive]"); String[] descriptions = request.getParameterValues("objarray[][description]"); JSONArray jsonArray = new JSONArray(); // 遍历数组组装JSON对象 for (int i = 0; i < itemIds.length; i++) { JSONObject jsonObj = new JSONObject(); jsonObj.put("itemId", itemIds[i]); jsonObj.put("idElem", idElems[i]); // 注意转成布尔类型 jsonObj.put("isActive", Boolean.parseBoolean(isActives[i])); jsonObj.put("description", descriptions[i]); jsonArray.put(jsonObj); } // 获取user参数 String user = request.getParameter("user");
额外建议
如果你用的是Spring框架,其实可以更简单:定义一个对应的Java实体类,然后用@RequestBody直接接收整个请求体,框架会自动帮你完成JSON到对象的转换,代码会更简洁。比如:
- 定义实体类:
public class PaymentRequest { private List<PriceItem> objarray; private String user; // getter和setter public static class PriceItem { private String itemId; private String idElem; private boolean isActive; private String description; // getter和setter } }
- 控制器方法:
@PostMapping("/cPayment") public ResponseEntity<?> handlePayment(@RequestBody PaymentRequest request) { List<PaymentRequest.PriceItem> priceList = request.getObjarray(); String user = request.getUser(); // 后续处理逻辑 return ResponseEntity.ok("SUCCESS"); }
这样就完全不用手动解析JSON了,非常方便!
内容的提问来源于stack exchange,提问作者Ram Thota
相关产品推荐
相关产品推荐

