YAML 转 JSON 后注释为什么没了?对象、数组和类型这样核对
把一份 YAML 配置改成接口需要的 JSON,最容易忽略的不是大括号,而是字段值的类型。0012 是编号还是数值,true 是开关还是一段文字,会影响程序怎样读取。宝塔拨测的“YAML/JSON互转”可以先把转换结果展开,适合核对这些差别。
本文用一份虚构服务配置演示双向转换。转换前请留原文:注释和原来的排版不属于这次往返能够完整保留的内容。
把配置对象和列表转成 JSON
进入“YAML/JSON互转”,保持“YAML → JSON”选项,将下面内容放进左侧“YAML 输入”,再点“转换为 JSON”:
# 示例配置
service: demo-api
replicas: 2
enabled: true
code: "0012"
empty: null
servers:
- host: api.example.test
port: 8080
右侧会输出 JSON。servers 下面的短横线表示一个列表项,这个列表项里又有 host 和 port 两个字段,转换后对应一个包含对象的数组。检查层级时,先看 servers 是否用方括号包围,再看里面是否有一组对象字段,避免把列表误读成同级配置。

这份结果中,replicas 的 2、port 的 8080 没有引号,属于数值;enabled 是布尔值 true;empty 是 null;code 则保留为字符串 "0012"。检查配置时可以按这几类逐项比较,不要只确认“字段名字都还在”。
输入中的注释 # 示例配置 没出现在输出里。这是本次转换的实际结果。YAML 注释用于解释文档,JSON 标准语法没有对应的注释写法。需要把配置说明一起交给同事时,应另外保留 YAML 原稿或说明文档,不能指望接收 JSON 的程序保留它。
转回 YAML,比较数据与原稿的差别
复制右侧 JSON,切到“JSON → YAML”,粘进“JSON 输入”后点击“转换为 YAML”。不要直接切换标签就认定输入已自动带过来,应核对当前框里的内容是不是刚才那份结果。

本次返回的 YAML 仍包含相同服务字段,servers 仍按列表显示,code 输出为 '0012'。双引号换成了单引号,但仍用于表达字符串;这与把编号变成数值是两种不同的变化。原来的注释没有恢复,说明中间结果没有携带它。
实际交付前可以把原稿与结果并排检查:对象层级、列表项数量、字段值和类型逐个对照。无需要求引号风格和空行完全相同,也不要因为排版看起来整齐,就跳过类型检查。
编号和文字开关,先明确是不是字符串
再做一个短测试,回到“YAML → JSON”输入:
code: 0012
yes_word: yes
flag: true
text_flag: "true"
本次输出如下:
{
"code": 12,
"yes_word": "yes",
"flag": true,
"text_flag": "true"
}

0012 的前导零已经丢掉。如果这是编号、邮编或固定宽度文本,最直接的办法是在 YAML 原文里给它加引号,再重新转换。flag 与 text_flag 则分别得到布尔值和字符串,程序读取时不能互相替代。
本次 yes 输出为字符串,但不要把这个结果推广成所有 YAML 版本或所有程序都使用相同规则。不同解析器、版本与配置可能影响标量的解释。准备给某个具体系统使用时,应以它要求的数据类型为准;对需要保留字面的字段,明确加引号,转换后再查看 JSON 里的引号是否还在。
这项工具适合先做数据结构与类型的转换核对。注释、引号风格和原始排版有保留要求的配置,应同时保存原文件;确认新格式能够被目标程序读取后,再替换正式文件。