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 将找不到对应嵌套路径,导致 MismatchedInputException: 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需要注意的问题(必看)