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

SpringBoot如何通过Swagger接口向Controller传入JSONArray参数

问题根源

  • 你使用@RequestParam接收JSONArray类型参数时,Spring默认没有内置String到org.json.JSONArray的类型转换器,且Swagger会将@RequestParam修饰的数组类型识别为多值参数,自动拆分你输入的JSON字符串,导致实际传入后端的第一个值是拆分后的name1,自然不符合JSONArray必须以[开头的要求。
  • @RequestParam参数默认是放在请求URL查询参数或者表单字段中,本身就不适合传输长度较长、结构复杂的JSON数据。
  • 你原有代码中的@Postmapping存在拼写错误,正确写法为@PostMapping(首字母M大写)。

解决方案1(推荐):改用@RequestBody接收请求体

这种方式天然支持Swagger显示单文本框输入JSON,不需要额外配置转换器,符合REST接口设计规范。

修改后的Controller代码:

@RestController
public class NameRegisterController{
  @Autowired
  private NameRegisterService service;
  
  @PostMapping(path="/control")
  public void NameRegisterAdd(@RequestBody JSONArray NameList)
  {
    service.addNames(NameList);
  }
}

可选依赖配置

如果启动后报转换器找不到异常,说明你的项目缺少Jackson对org.json类型的序列化支持,添加对应依赖即可(Maven示例):

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-json-org</artifactId>
    <version>2.15.2</version>
</dependency>

修改后Swagger会自动显示单文本的请求体输入框,直接输入["name1","name2","name3"]即可正常接收。


解决方案2:坚持使用@RequestParam的处理方式

如果你确实需要通过请求参数传输JSONArray,先以String类型接收参数,再手动转换为JSONArray:

修改后的Controller代码:

@RestController
public class NameRegisterController{
  @Autowired
  private NameRegisterService service;
  
  @PostMapping(path="/control")
  public void NameRegisterAdd(@RequestParam String NameList)
  {
    JSONArray jsonArray = new JSONArray(NameList);
    service.addNames(jsonArray);
  }
}

修改后Swagger会显示单文本输入框,你输入的JSON字符串会完整传入后端,手动转换即可避免拆分报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:57:00