You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:45:38