数据格式与结构化数据
YAML 配置无法加载,如何检查语法?
使用工具
复制配置并加几行后,某个服务的设置不生效。把制表符改成空格后错误消失,行为却仍不对。YAML 的问题不仅是语法无效,也可能是合法文本描述了与你想象不同的层级。
这里使用虚构的 server 与 worker,不把设置应用到实际服务。用 YAML 格式化与验证检查语法,需要时通过 JSON 与 YAML 转换观察结构和类型。目标是能说明字段属于哪个父级,而不是格式化成功后就覆盖生产配置。
修改前,先缩小问题范围
几百行配置报错时,先自行保留工作副本,再截取相关父项与子项。只复制子项可能改变缩进上下文,导致无法复现。保留父行、在编辑器中显示空白、区分制表符与空格,比全局替换更容易确认原因和修复的关系。
两个空格,可能改变设置的归属
server:
host: example.invalid
timeout: 30
worker:
enabled: true
server:
host: example.invalid
timeout: 30
worker:
enabled: true
将两个例子分别放进 YAML 格式化与验证。两者都能解析,但结构不同:A 把 timeout 放在 server 内,B 则与 server 同级。检查无错误后,还要看 timeout 属于哪个父级。行首空格不是装饰。
如果不易看清,可以把两份示例转成 JSON,观察大括号范围。A 是 server.timeout,B 是根级 timeout。转换只是观察关系的辅助,不意味着必须迁移成 JSON。正确位置仍需对照接收服务的配置规范。
加上连字符,可能就成了另一项
services:
- name: api
port: 8080
- name: worker
port: 8081
这里有两个连字符,对应两个列表元素。每个 port 与前面的 name 同属一项。如果在 port 前也加连字符,可能变成只含端口的独立元素,形成外观相似的四项列表。要同时核对数量以及名称和端口是否配对。
格式化工具不知道你想要两项还是四项,只会整理能读到的结构。把配置移到另一层时,应先确定其全部子项,而不是只移动一行。比较前后结果前,先记下预期元素数量,有助于发现意外分组。
false 与 "false" 不只是外观不同
enabled: false
label: "false"
count: 3
code: "003"
note: null
empty: ""
转成 JSON 后,enabled 是布尔值,label 是字符串,count 是数字,code 是保留前导零的字符串。note 为 null,empty 为空字符串。显示相似不代表程序同样处理,编号若先按数字读取而丢失前导零,之后格式化也无法可靠恢复。
也不能因此把所有值都加引号,true 或 30 变成字符串后可能不符合接收方要求。引号用于表达字符串意图,不是隐藏错误。YAML 版本和读取方式可能不同,其他工具能解析,不能替代实际接收方的验证。
同一个键写两次,后面的会覆盖吗?
timeout: 30
timeout: 60
SheepDev 会把此例作为重复键拒绝。应先确定要保留哪个值,而不是默认后者优先。叠加多个配置文件与在同一映射中重复键不同,不能把框架的文件合并规则直接套用到文档内部重复。
但 server.timeout 与 worker.timeout 父级不同,是两个设置。全文搜索找到两次 timeout,并不意味着应该删除其中一次。修复重复前也要先看层级,普通去重行工具不懂配置结构,可能删掉必要字段。
两行文字为什么会变成一行
literal: |
first line
second line
folded: >
first line
second line
转成 JSON 后,literal 保留中间换行,folded 则用空格连接这两行。本例两者末尾都有换行。写法都是两行,不代表读出的字符串相同;通知文字、签名内容和传给命令的文本都可能受影响。
这个实验只涉及相同缩进的普通两行,不要推断含空行或额外缩进的文本也会被 > 全部合成一行。应截取实际使用的代表片段,检查转换后的换行。除了源文件是否美观,还要确认读取后的文字符合预期。
复制时,也要检查注释与值的边界
color: "#4F46E5"
message: "status: ready"
retries: 3 # calculation example
颜色中的 # 或句子中的冒号需要作为内容时,可以用引号明确字符串。retries 后的注释不属于数字 3。复制文章示例时,也应分清输入和说明,不要因符号看起来可疑就删除,否则可能破坏颜色或文本。
转成 JSON 后,注释不会作为普通数据保留。YAML 格式化与跨格式转换保留的信息不同。如果注释说明了运维决策,不应只用转换结果代替原文件。区分观察用副本与团队维护的正式配置,可避免混淆。
从能解析,走向符合意图
最后检查应用要求的字段名、类型和必填项。YAML 语法无法决定 timeout 是秒还是毫秒,也无法决定服务允许哪些端口。SheepDev 不会将配置发送或应用到服务,也不执行其专用启动验证。如有配置检查命令或安全测试环境,应继续在那里确认。
说明修复时,只说“改了缩进”可能不够。说“把 timeout 从根级移回 server 下,保留数值 30”,就能说明结构与值分别检查过。依次确认能否解析、层级是否符合意图、含义是否符合应用,可避免一直追着空格修改。