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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:45:07