Spring Boot如何将嵌套JSON请求体映射至自定义实体类?
问题解答
不需要先以字符串接收再解析,Spring MVC结合Jackson可以直接完成嵌套JSON到实体类的映射,但不能直接用Book作为@RequestBody的参数——因为你传入的JSON根对象并非Book,而是包含Book属性的外层对象。
解决方案1:创建外层实体类(推荐)
定义一个对应整个请求JSON结构的实体类,把Book作为它的属性,Spring会自动完成嵌套映射:
外层实体类代码
@Data public class BookRequest { // Jackson默认支持驼峰与下划线的自动匹配,也可通过@JsonProperty指定严格key名 private String functionCall; private Long dateCalled; private Book book; }
如果需要严格匹配JSON中的原始key名称,可添加@JsonProperty注解:
@JsonProperty("function_call") private String functionCall; @JsonProperty("date_called") private Long dateCalled; @JsonProperty("Book") private Book book;
修改后的Controller代码
@PostMapping("/data-product") @ResponseBody public void createBook(@RequestBody BookRequest bookRequest) { Book book = bookRequest.getBook(); System.out.println(book); }
解决方案2:用Map接收并手动转换(临时场景适用)
如果不想创建外层实体类,也可以用Map<String, Object>接收整个请求体,再提取嵌套的Book对象转换:
@PostMapping("/data-product") @ResponseBody public void createBook(@RequestBody Map<String, Object> requestMap) { ObjectMapper objectMapper = new ObjectMapper(); Book book = objectMapper.convertValue(requestMap.get("Book"), Book.class); System.out.println(book); }
这种方式可读性和维护性较差,不推荐在正式项目中大量使用。
原代码失效原因
你原代码用@RequestBody Book book,Spring会尝试把整个请求JSON直接映射为Book对象,但JSON根节点的属性是function_call、date_called、Book,和Book类的id、title、desc完全不匹配,最终book的属性都会是默认值(如id=0、title=null)。
内容的提问来源于stack exchange,提问作者jason
相关产品推荐
相关产品推荐

