java - spring请求体将名称分配给数组/列表

标签 java json spring spring-boot jackson

我目前正在接受请求正文中的学生列表。

public void saveStudents(@RequestBody List<Student> Students){

}

它接受下面的 JSON

 [
      {
        "name": "",
        "rollNo": ""
      },
      {
        "name": "",
        "rollNo": ""
      }
  ]

我想接受的不是上面的

{
  "students": [
    {
      "name": "",
      "rollNo": ""
    },
    {
      "name": "",
      "rollNo": ""
    }
  ]
}

我已经尝试过

 public void saveStudents(@RequestBody @JsonProperty("students") List<Student> Students){

 }

但它不接受。

我不想创建另一个包含学生列表的对象。

有什么方法可以为数组/列表分配名称吗?

最佳答案

@RequestBody 注释代表发送的内容 - 表示 JSON。不存在额外的映射方法来打乱注释内的这些内容,因此 body 始终代表一个可以映射的对象。

jackson 注释 @JsonProperty 被定义为注释 JSON 类中的字段/方法 - 因此对 Controller 方法/参数没有影响

建议方式

恕我直言,您应该简单地接受您需要创建一个新类,因为这是最简单也是正确的方法:例如

import java.util.ArrayList;
import java.util.List;

public class StudentList {

    // simplest example approach by public field...
    public List<Student> students = new ArrayList<>();
}

您的 Controller 代码应如下所示:

    @RequestMapping(path="/api/students",method = RequestMethod.POST)
    public void saveStudents(@RequestBody StudentList list) {
        // do stuff...
    }

所以body中的JSON代表了一个clazz。它易于维护、易于阅读、可扩展、KISS,并且还使用 spring/jackson 默认值,无需任何特殊配置。

其他不建议的方式

我考虑过其他选项来处理这个问题,但没有一个是 KISS 或良好的可维护性:

转换器

您可以编写一个转换器类,请参阅 https://www.baeldung.com/spring-httpmessageconverter-rest

但我认为这是一种矫枉过正/过度工程来解决避免新值(value)类别的问题。

解析 JSON(极其难看)

您可以直接处理 JSON 解析

    @RequestMapping(path="/api/students",method = RequestMethod.POST)
    public void saveStudents(@RequestBody String json) {
          ObjectMapper mapper = new ObjectMapper();
          JsonNode node = Json.node(json);
          JsonNode students = node.get("students");
          // ... than convert back to a list containing students ...
    }

但这会......维护起来很糟糕,不是 KISS ,不可读。

关于java - spring请求体将名称分配给数组/列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62190073/

相关文章:

spring - Web 应用程序异常 : javax. ws.rs.NotSupportedException:HTTP 415 不支持的媒体类型

spring - 用于 API 安全性的 AntMatcher 和 contextPath

java - 如何使用 JPA CriteriaBuilder selectCase() 以便它可以将 Predicate 作为结果?

java - Rest DSL 路由 - 由于不允许同一端点有多个消费者,因此无法启动路由

json - 如何将 JSON 数组转换为对象

java - 解析 JSON 字符串返回未定义

java - 请求未异步处理

java - 如何向变量悬停弹出窗口添加按钮

java - 使用 Groovy 和 Java 改进代码的最佳方法、技巧和示例

javascript - Express.js - 对每个 HTTP 请求执行函数