Spring Boot中动态键值多类型嵌套JSON请求如何映射为POJO
Spring Boot动态键值JSON请求映射方案
核心思路:对于键动态、值类型不固定的JSON对象,直接用Map<String, Object>承接即可,不需要单独定义Specifics类,Spring Boot默认集成的Jackson会自动根据值的类型完成解析映射。
1. 修正POJO类代码
所有POJO类必须添加无参构造方法、getter、setter,否则Jackson反序列化会报错。
1.1 Item类
import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Map; public class Item { // JSON根节点的对应键是name,用JsonProperty指定映射关系 @JsonProperty("name") private Title title; // 用Map承接动态specifics,键为字符串,值为任意类型 private Map<String, Object> specifics; private Description description; // 此处添加无参构造、getter、setter }
1.2 Title类
字段和JSON结构完全匹配,无需额外配置:
public class Title { private String subtitle; private String title; // 此处添加无参构造、getter、setter }
1.3 Description类
JSON中的short、long是Java保留关键字,无法直接作为字段名,用@JsonProperty指定映射关系:
import com.fasterxml.jackson.annotation.JsonProperty; public class Description { @JsonProperty("short") private String shortDes; @JsonProperty("long") private String longDes; private String language; // 此处添加无参构造、getter、setter }
2. Controller层接收请求
直接用@RequestBody注解承接请求即可,框架会自动完成JSON到POJO的转换:
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; @RestController public class ItemController { @PostMapping("/addItem") public String addItem(@RequestBody Item item) { // 拿到specifics后可按实际类型处理数据 Map<String, Object> specifics = item.getSpecifics(); // 示例:取值并判断类型 Object color = specifics.get("color"); if (color instanceof List) { List<?> colorList = (List<?>) color; // 处理列表逻辑 } else if (color instanceof String) { // 处理单个字符串逻辑 } // 其他类型同理用instanceof判断:Integer、Boolean等 return "请求处理成功"; } }
Jackson默认类型映射规则
完全匹配你的需求场景:
- 单独字符串值 ->
String - 布尔值 ->
Boolean - 整数值 ->
Integer(超大整数自动转Long) - 字符串列表 ->
List<String> - 整数列表 ->
List<Integer>
内容的提问来源于stack exchange,提问作者Sumeet Kumar Yadav
相关产品推荐
相关产品推荐

