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

Spring Boot RestController中如何将JSON映射至包装类内的EnumMap

解决方案

1. 修正Task类的字段映射问题

JSON中的字段是allotedTime,但Task类中定义的alottedTime存在拼写差异,需通过@JsonProperty注解明确映射关系:

@Data
public class Task {

    private String name;

    @Min(value = 0, message = "Time should not be less than 0")
    @JsonProperty("allotedTime") // 匹配JSON中的键名
    private int alottedTime;

}

2. 解决WrapperClass与JSON结构不匹配的问题

当前JSON直接以星期名称为顶级键,而WrapperClass的taskList字段需要对应嵌套对象,有两种处理方式:

方式一:调整JSON结构(推荐,符合封装规范)

修改请求JSON,将所有星期数据嵌套在taskList键下,与WrapperClass的字段名对应:

{
    "taskList": {
        "monday": [
            {
                "name": "task1",
                "allotedTime": 15
            }
        ],
        "tuesday": [
            {
                "name": "open",
                "allotedTime": 20
            },
            {
                "name": "close",
                "allotedTime": 60
            }
        ]
    }
}

这种方式下原WrapperClass无需额外修改,Jackson会自动将taskList节点内容映射到EnumMap中(默认支持将小写星期字符串转换为DayOfWeek枚举常量)。

方式二:不修改JSON,通过注解适配WrapperClass

如果无法调整请求JSON结构,可在WrapperClass中添加@JsonAnySetter方法,将顶级键转换为DayOfWeek枚举并填充到EnumMap:

@Data
public class WrapperClass {
  
    private EnumMap<DayOfWeek, List<Task>> taskList = new EnumMap<>(DayOfWeek.class);

    @JsonAnySetter
    public void setTaskByDay(String dayStr, List<Task> tasks) {
        // 将小写星期字符串转为枚举常量的大写形式
        DayOfWeek day = DayOfWeek.valueOf(dayStr.toUpperCase());
        taskList.put(day, tasks);
    }
}

注意提前初始化EnumMap避免null,通过toUpperCase()完成枚举值的大小写转换。

3. 修正控制器参数绑定

确保BindingResult与@Valid修饰的参数相邻:

@PostMapping("/taskApi")
public ResponseEntity<String> createTaskList(@Valid @RequestBody WrapperClass wrapperclass, BindingResult result) {
    if (result.hasErrors()) {
        return ResponseEntity.badRequest().body("Invalid request: " + result.getAllErrors());
    }
    // 业务逻辑处理
    return ResponseEntity.ok("Tasks received successfully");
}

内容的提问来源于stack exchange,提问作者aswathy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:13:32