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

如何在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到对象的转换,代码会更简洁。比如:

  1. 定义实体类:
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
    }
}
  1. 控制器方法:
@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:12:42