You need to enable JavaScript to run this app. Spring Boot处理注册请求时无法反序列化JSON数组报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot处理注册请求时无法反序列化JSON数组报错如何解决

报错原因
  • 核心问题是前端提交的请求体数据结构和后端@RequestBody声明的参数类型不匹配:后端期望接收单个RegistrationRequest对象格式的JSON,但是前端实际提交的是JSON数组(请求体以[开头),Jackson反序列化时无法把数组转成单个对象,就抛出了这个异常。
  • 常见触发场景:
    1. 表单序列化时错误把字段拼成了数组结构,没有包裹在单个对象里
    2. AJAX请求提交时误把表单字段数组直接传给了data参数,没有做对象转换
    3. 错误设置请求头Content-Type为application/json,但实际传的是表单序列化的数组格式数据
解决方案

前端修改(推荐,符合接口设计预期)

调整表单提交的参数结构,把所有表单字段放到同一个对象里再转成JSON字符串提交,示例代码:

// 错误写法(提交数组触发报错)
let formData = $("form").serializeArray();
$.ajax({
  url: "/registration",
  type: "POST",
  contentType: "application/json",
  data: JSON.stringify(formData),
  success: res => {}
})

// 正确写法(转成单个对象提交)
let formArr = $("form").serializeArray();
let formObj = {};
formArr.forEach(item => {
  formObj[item.name] = item.value;
});
$.ajax({
  url: "/registration",
  type: "POST",
  contentType: "application/json",
  data: JSON.stringify(formObj),
  success: res => {}
})

如果是原生表单提交不想用AJAX,直接去掉后端接口参数的@RequestBody注解,用实体类或者@RequestParam接收表单参数即可,不需要传JSON格式。

后端修改(适配现有前端提交逻辑,不推荐)

如果前端逻辑无法修改,且提交的是只有一个元素的数组,可以把后端接口的参数类型改成List<RegistrationRequest>,取列表第一个元素处理即可,示例:

// 修改前
@PostMapping
public String register(@RequestBody RegistrationRequest request) {
  // 原有业务逻辑
}

// 修改后
@PostMapping
public String register(@RequestBody List<RegistrationRequest> requestList) {
  RegistrationRequest request = requestList.get(0);
  // 原有业务逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 00:48:02