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&lt;Map&lt;String, String&gt;&gt;。 或者更好的是,使用集合 (see this post)。

【讨论】:

【参考方案3】:

Map 用于键值对,您有键值对列表。

Map&lt;String, String&gt; 更改为List&lt;Map&lt;String, String&gt;&gt;

【讨论】:

以上是关于Spring Boot REST 读取 JSON 数组有效负载的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot REST 服务:JSON 反序列化不起作用

Scala、Json 和 Spring Boot Rest

带有 Spring Boot REST 控制器和 JSON 的空字段

尝试通过 Spring Boot Rest 使用 Jackson 验证 JSON

如何使用Spring Boot REST生成自定义JSON响应?

无法使用 Spring Boot Rest 服务将 JSON 转换为 Java 对象