YAMLMapper 解析带点号(.)的嵌套键路径的正确方法
发布时间 - 2025-12-29 00:00:00 点击率:次本文详解如何使用 jackson 的 yamlmapper 正确解析 yaml 中以点号分隔的扁平化键(如 `formatting.template`),避免 `mismatchedinputexception`,关键在于 json pointer 路径必须与 yaml 实际结构严格匹配。
Jackson 的 YAMLMapper 是一个严格遵循 YAML 规范的解析器,它不会将点号(.)自动解释为嵌套层级分隔符——这与 Spring Boot 的 @ConfigurationProperties 加载机制有本质区别。Spring 在内部会将 YAML 转换为 Properties 形式,并将 a.b.c 视为三层嵌套映射;但原生 YAMLMapper 仅按 YAML 文档的真实结构(即缩进/映射关系)解析,formatting.template: 在 YAML 中是一个单层键名(key name),而非嵌套对象。
因此,当你的 YAML 文件写成:
formatting.template:
fields:
- name: birthdate
type: java.lang.String
subType: java.util.Date
lenght: 10这在 YAML 语法中表示:根级别存在一个键名为字符串 "formatting.template" 的映射,其值是一个包含 fields 的对象。此时,若仍使用 JSON Pointer /formatting/template(意图为“进入 formatting 对象,再进入 template 对象”),YAMLMapper 将找不到对应嵌套路径,导致 Mismatched
InputException: No content to map due to end-of-input —— 因为 /formatting/template 在文档中根本不存在,实际存在的只有 /formatting.template。
✅ 正确做法是:JSON Pointer 必须精确匹配 YAML 键名字面量。
修改读取代码中的 JSON Pointer 即可:
return mapper.readerFor(FormattingConfigurationProperties.class)
.at("/formatting.template") // ← 关键:用斜杠包裹完整键名,不拆分为路径
.readValue(inputStream);⚠️ 注意事项:
- JSON Pointer 中的 / 是路径分隔符,而 . 是普通字符;/formatting.template 表示查找键名为 "formatting.template" 的直接子节点;
- 不要写成 .at("formatting.template")(缺少前导 /),否则 Jackson 会将其视为相对路径或抛出 IllegalArgumentException;
- 若需兼容两种 YAML 格式(扁平键 vs 分层缩进),建议统一采用分层结构(即 formatting:\n template:\n fields: ...),因其语义清晰、可读性强,且与 Spring 配置习惯完全一致;
- lenght 字段名疑似拼写错误(应为 length),虽不影响解析,但建议修正以避免后续维护歧义。
总结:YAMLMapper 无“点号自动嵌套”逻辑,一切以 YAML 实际结构为准。使用扁平键时,JSON Pointer 必须字面量匹配;追求工程一致性时,推荐采用标准缩进式嵌套写法。
# java
# js
# json
# app
# stream
# 区别
# spring
# spring boot
# 字符串
# Length
# pointer
# map
# 对象
# input
# 是一个
# 键名
# 会将
# 文档
# 分隔符
# 找不到
# 两种
# 将其
# 并将
# 不存在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Python并发异常传播_错误处理解析【教程】
JavaScript实现Fly Bird小游戏
魔毅自助建站系统:模板定制与SEO优化一键生成指南
node.js报错:Cannot find module 'ejs'的解决办法
zabbix利用python脚本发送报警邮件的方法
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何快速搭建自助建站会员专属系统?
如何选择PHP开源工具快速搭建网站?
Laravel定时任务怎么设置_Laravel Crontab调度器配置
C#如何调用原生C++ COM对象详解
EditPlus中的正则表达式 实战(2)
IOS倒计时设置UIButton标题title的抖动问题
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
如何在云主机上快速搭建网站?
JavaScript如何实现路由_前端路由原理是什么
千库网官网入口推荐 千库网设计创意平台入口
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
Laravel安装步骤详细教程_Laravel环境搭建指南
如何快速启动建站代理加盟业务?
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Laravel如何自定义错误页面(404, 500)?(代码示例)
,怎么在广州志愿者网站注册?
如何用花生壳三步快速搭建专属网站?
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
EditPlus 正则表达式 实战(3)
Laravel模型事件有哪些_Laravel Model Event生命周期详解
如何快速搭建安全的FTP站点?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
利用python获取某年中每个月的第一天和最后一天
青岛网站建设如何选择本地服务器?
如何用景安虚拟主机手机版绑定域名建站?
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
Laravel怎么判断请求类型_Laravel Request isMethod用法
香港服务器部署网站为何提示未备案?
Linux系统命令中screen命令详解
Laravel如何与Inertia.js和Vue/React构建现代单页应用
开心动漫网站制作软件下载,十分开心动画为何停播?
Laravel如何实现用户密码重置功能?(完整流程代码)
高端云建站费用究竟需要多少预算?
如何挑选最适合建站的高性能VPS主机?
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
linux写shell需要注意的问题(必看)

