把一份 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 是否用方括号包围,再看里面是否有一组对象字段,避免把列表误读成同级配置。

左侧输入带注释的 YAML,右侧 JSON 保留服务字段和 servers 对象数组
左侧输入带注释的 YAML,右侧 JSON 保留服务字段和 servers 对象数组

这份结果中,replicas 的 2、port 的 8080 没有引号,属于数值;enabled 是布尔值 true;empty 是 null;code 则保留为字符串 "0012"。检查配置时可以按这几类逐项比较,不要只确认“字段名字都还在”。

输入中的注释 # 示例配置 没出现在输出里。这是本次转换的实际结果。YAML 注释用于解释文档,JSON 标准语法没有对应的注释写法。需要把配置说明一起交给同事时,应另外保留 YAML 原稿或说明文档,不能指望接收 JSON 的程序保留它。

转回 YAML,比较数据与原稿的差别

复制右侧 JSON,切到“JSON → YAML”,粘进“JSON 输入”后点击“转换为 YAML”。不要直接切换标签就认定输入已自动带过来,应核对当前框里的内容是不是刚才那份结果。

把刚才的 JSON 粘到反向转换页,输出的 code 使用单引号,原注释没有恢复
把刚才的 JSON 粘到反向转换页,输出的 code 使用单引号,原注释没有恢复

本次返回的 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 转为数值 12,带引号的 true 保留为字符串
不加引号的 0012 转为数值 12,带引号的 true 保留为字符串

0012 的前导零已经丢掉。如果这是编号、邮编或固定宽度文本,最直接的办法是在 YAML 原文里给它加引号,再重新转换。flag 与 text_flag 则分别得到布尔值和字符串,程序读取时不能互相替代。

本次 yes 输出为字符串,但不要把这个结果推广成所有 YAML 版本或所有程序都使用相同规则。不同解析器、版本与配置可能影响标量的解释。准备给某个具体系统使用时,应以它要求的数据类型为准;对需要保留字面的字段,明确加引号,转换后再查看 JSON 里的引号是否还在。

这项工具适合先做数据结构与类型的转换核对。注释、引号风格和原始排版有保留要求的配置,应同时保存原文件;确认新格式能够被目标程序读取后,再替换正式文件。