如何让深度嵌套的YAML结构更简洁易读?
YAML本是主打“人性化”的配置语言,但结构简单的深度嵌套配置有时会显得杂乱难读,比如下面这段:
system: config: subsystem: project: name: "coolproject" version: "1.0.0" stages: - something: name: "foo" - something: name: "bar" - something: name: "baz"
我想合并这类仅含单个子节点的嵌套层级,原本期望能写成类似这样的简洁形式:
system: config: subsystem: project: name: "coolproject" version: "1.0.0" stages: - something: name: "foo" - something: name: "bar" - something: name: "baz"
但这并不是有效的YAML语法。我还试过system:config:subsystem:project:(无空格)、system.config.subsystem.project:以及system/config/subsystem/project:这些写法,虽然能生效,但都会被解析成包含特殊符号的单个键,而非嵌套结构。查了YAML规范好像没相关支持,但还是想问问有没有什么巧妙的技巧或变通方法。
先给你明确结论:YAML核心规范里确实不支持这种“连续冒号压缩嵌套”的写法,你尝试的那些带点、冒号、斜杠的写法,都会被当作单个字符串键,没法解析成嵌套结构。不过有几个实际可用的变通方案:
用YAML流样式精简代码:对于简单嵌套,可以用花括号把内层结构挤在一行,虽然没完全消除层级,但能减少换行,可读性也不差,而且完全符合规范:
system: { config: { subsystem: { project: { name: "coolproject", version: "1.0.0" } } } } stages: - { something: { name: "foo" } } - { something: { name: "bar" } } - { something: { name: "baz" } }解析后的结构和原始嵌套完全一致。
加个预处理脚本(如果允许):要是你的项目流程能加额外步骤,可以自己写个简单脚本,把你想要的那种压缩写法转换成标准YAML再解析。比如写个小工具,把
system: config: subsystem: project:这种格式替换成标准的缩进嵌套结构。当然这需要额外的处理环节,适合有特殊需求的场景。调整配置结构(自己能控制的话):如果这个配置结构是你自己定义的,干脆直接扁平化,比如写成
system_project_name: "coolproject"、system_project_version: "1.0.0",虽然失去了嵌套的语义,但配置会简洁很多。不过这得看你的业务场景能不能接受这种扁平化的结构。
内容的提问来源于stack exchange,提问作者RuRo

