Spring Boot REST 读取 JSON 数组有效负载
Posted
技术标签:
【中文标题】Spring Boot REST 读取 JSON 数组有效负载【英文标题】:Spring Boot REST to read JSON array payload 【发布时间】:2020-03-24 02:57:55 【问题描述】:我有这个 PostMapping 方法
@PostMapping("/offreStage/id/users")
public ResponseEntity<?> addAuthorizedStudents(@PathVariable Long id,
@RequestBody Map<String, String> students)
return service.addAuthorizedStudentsToOffer(id, students);
我使用以下 JSON 有效负载来发出我的发布请求:
[
"value": 15,
"label": "student2@gmail.com"
,
"value": 14,
"label": "student21@gmail.com"
]
这将返回以下内容:
"message": "JSON 解析错误:无法反序列化
java.util.LinkedHashMap
出 START_ARRAY 令牌;嵌套异常 是 com.fasterxml.jackson.databind.exc.MismatchedInputException: 不能 从 START_ARRAY 中反序列化java.util.LinkedHashMap
的实例 令牌\n 在 [Source: (PushbackInputStream);行:1,列:1]",
【问题讨论】:
【参考方案1】:由于您发送 JSON 的方式,它不起作用。在您的示例中,您实际上是在发送一个地图数组作为 Json,并期望 Spring 将其转换为地图。在您的 JS 中将结构转换为单个映射,或者您可以在后端使用对象来相应地映射 json 中的数据,例如:
[
"value": 15,
"label": "student2@gmail.com"
,
"value": 14,
"label": "student21@gmail.com"
]
然后你可以像这样使用你的控制器:
@PostMapping("/offreStage/id/users")
public ResponseEntity<?> addAuthorizedStudents(@PathVariable Long id,
@RequestBody List<ObjectClass> students)
return service.addAuthorizedStudentsToOffer(id, students);
你的对象类可能是这样的:
public class ObjectClass
String value;
String label;
//getters and setters
【讨论】:
【参考方案2】:发送的正文与函数中的不匹配。
更准确地说,这是你的地图:
"value": 15,
"label": "student2@gmail.com"
您需要一个地图列表,所以它不起作用。所以应该是这样的:函数中的List<Map<String, String>>
。
或者更好的是,使用集合 (see this post)。
【讨论】:
【参考方案3】:Map 用于键值对,您有键值对列表。
将Map<String, String>
更改为List<Map<String, String>>
【讨论】:
以上是关于Spring Boot REST 读取 JSON 数组有效负载的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot REST 服务:JSON 反序列化不起作用
带有 Spring Boot REST 控制器和 JSON 的空字段
尝试通过 Spring Boot Rest 使用 Jackson 验证 JSON