如何在不定义请求类的情况下灵活处理动态 JSON 请求体(含数组字段)
发布时间 - 2026-01-12 00:00:00 点击率:次本文介绍在 spring boot 中不依赖固定 dto 类,直接解析并操作任意结构的 json 请求体,尤其支持字符串、数组等混合类型字段的动态处理方案。
在实际开发中,API 接口常需接收结构不确定的请求体(如配置项、扩展字段、多租户自定义属性等)。若强行用 HashMap
推荐方案:以原始 JSON 字符串接收 + Jackson 动态树模型解析
@PostMapping("/employees")
public ResponseEntity getEmployees(@RequestBody String rawJson)
{
ObjectMapper mapper = new ObjectMapper();
try {
JsonNode rootNode = mapper.readTree(rawJson);
// ✅ 安全读取字符串字段(自动处理缺失/空值)
String employeeId = rootNode.path("employeeId").asText("");
String empName = rootNode.path("empName").asText("");
// ✅ 正确读取字符串数组(即使字段不存在也返回空列表)
List awards = new ArrayList<>();
JsonNode awardsNode = rootNode.path("empAwardsReceived");
if (awardsNode.isArray()) {
awardsNode.forEach(node -> awards.add(node.asText()));
}
// ✅ 动态添加新字段(例如注入时间戳或服务端计算值)
((ObjectNode) rootNode).put("processedAt", Instant.now().toString());
// 后续业务逻辑...
EmployeeResponse response = processEmployee(employeeId, empName, awards);
return ResponseEntity.ok(response);
} catch (JsonProcessingException e) {
return ResponseEntity.badRequest()
.body(new EmployeeResponse("Invalid JSON format"));
}
} 关键要点说明:
- 使用 @RequestBody String 避免 Spring MVC 的自动类型转换限制,保留原始 JSON 结构;
- JsonNode 是 Jackson 的不可变树模型,path() 方法安全访问嵌套字段(无 NPE 风险);
- isArray() + forEach() 精准识别并遍历数组节点,避免 asText() 错误转义;
- 通过强转为 ObjectNode 可动态增删改节点,满足运行时修改需求;
- ⚠️ 注意:生产环境建议配合 @Validated 或自定义校验注解对关键字段做存在性/格式校验,避免过度依赖动态解析带来的隐式错误。
此方案兼顾灵活性与健壮性,无需为每个动态接口维护 DTO,同时完整支持 JSON 全类型(对象、数组、布尔、数字),是微服务网关、低代码平台、配置中心等场景的理想实践。
# js
# json
# node
# app
# spring mvc
# 字符串数组
# mvc
# spring
# spring boot
# String
# foreach
# 字符串
# 接口
# 类型转换
# 对象
# 低代码
# 自定义
# 遍历
# 不存在
# 布尔
# 将被
# 不确定
# 而非
# 中不
# 服务端
# 擦除
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
实例解析Array和String方法
高性能网站服务器部署指南:稳定运行与安全配置优化方案
Laravel如何处理表单验证?(Requests代码示例)
Android GridView 滑动条设置一直显示状态(推荐)
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
Laravel storage目录权限问题_Laravel文件写入权限设置
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
非常酷的网站设计制作软件,酷培ai教育官方网站?
Android Socket接口实现即时通讯实例代码
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
利用 Google AI 进行 YouTube 视频 SEO 描述优化
Android仿QQ列表左滑删除操作
如何在Windows虚拟主机上快速搭建网站?
详解jQuery中基本的动画方法
WEB开发之注册页面验证码倒计时代码的实现
JavaScript如何实现倒计时_时间函数如何精确控制
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
Laravel模型事件有哪些_Laravel Model Event生命周期详解
北京企业网站设计制作公司,北京铁路集团官方网站?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
Mybatis 中的insertOrUpdate操作
简历在线制作网站免费版,如何创建个人简历?
微信小程序 require机制详解及实例代码
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
南京网站制作费用,南京远驱官方网站?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
javascript基于原型链的继承及call和apply函数用法分析
如何在腾讯云服务器快速搭建个人网站?
使用Dockerfile构建java web环境
Laravel Fortify是什么,和Jetstream有什么关系
Linux系统命令中tree命令详解
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
零基础网站服务器架设实战:轻量应用与域名解析配置指南
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案


{
ObjectMapper mapper = new ObjectMapper();
try {
JsonNode rootNode = mapper.readTree(rawJson);
// ✅ 安全读取字符串字段(自动处理缺失/空值)
String employeeId = rootNode.path("employeeId").asText("");
String empName = rootNode.path("empName").asText("");
// ✅ 正确读取字符串数组(即使字段不存在也返回空列表)
List