我目前正在接受请求正文中的学生列表。
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/