yaml转json需先清洗格式再分步转换:冒号后空格必须统一,键值需按类型加引号或保留原格式,缩进变化处手动补大括号,短横线数组需围方括号并逐项处理,注释须预先删除,复杂语法(锚点、多行字符串)应改用yaml2json工具。

YAML转JSON时冒号后空格不统一导致解析失败
Sublime 的正则替换不能直接执行 YAML 解析,必须先清洗格式再模拟结构转换。YAML 对 : 后的空格敏感(key: value 合法,key:value 通常不被识别),而 JSON 要求双引号包裹键名和字符串值。常见错误是直接替换 : 为 : + ",结果把数字、true、null 等也包进引号里,导致 JSON 无效。
实操建议:
- 先用
^\s*(\w+):$匹配顶层或嵌套的键行(结尾有冒号无值),替换成"$1": {—— 注意保留缩进空格,用^和\s*捕获并还原 - 再匹配带值的行:
^\s*(\w+):\s+(.+)$,替换为"$1": "$2",但仅适用于纯字符串值;若值含{、[、true、false、null或数字,需单独处理 - 对布尔/空值/数字,用多轮替换:例如
:\s+true\b→: true(不加引号),:\s+"true"是错的
Sublime中处理缩进与嵌套层级的关键正则模式
YAML 的层级靠空格数决定,JSON 则靠大括号和逗号。Sublime 不支持条件替换或嵌套计数,所以不能全自动“闭合”对象。必须分步处理缩进变化点,否则生成的 JSON 缺少 } 或多出逗号。
实操建议:
- 先统一缩进为 2 空格(
Convert Indentation → To Spaces → 2),避免 Tab 和空格混用干扰正则 - 用
^( {2,})\w+:捕获缩进前缀,确认每级缩进是否比上一行多/少 2 个空格,手动在缩进减少处补},(注意逗号位置) - 最末尾所有未闭合的
{,需在文件末尾批量补足对应数量的}—— 可用Ctrl+Shift+P→Selection → Select All Matching找出所有{和}数量差
数组(YAML中的短横线)转JSON方括号的注意事项
YAML 中的 - item 行必须转成 JSON 数组元素,但 Sublime 正则无法跨行匹配,所以不能用单条规则把多行 - 合并为 [...]。直接替换 ^- 为 " 会破坏结构。
实操建议:
- 先将每个数组块单独围起来:查找
^\s*-\s.*$\n(?!\s*-\s)(即以-开头、下一行不是-的行),手动在该块上下加[和] - 再替换块内每一项:
^\s*-\s+(.+)$→"$1"(字符串)或$1(数字/布尔)—— 注意保留原缩进用于定位 - 若数组项本身是对象(如
- name: a\n age: 20),必须先把它转成 JSON 对象再放入数组,不能只加引号
验证输出JSON有效性及常见失效点
Sublime 替换完的文本看起来像 JSON,但很可能语法错误:多余逗号、引号逃逸缺失(如值含 " 或换行)、布尔值被引号包裹、末尾缺 }。不要依赖肉眼检查。
实操建议:
- 复制结果到
https://jsonlint.com/或 VS Code(粘贴后按Shift+Alt+F格式化,报错即停) - 特别检查:所有
key: null是否变成"key": null(不是"key": "null"),key: 123是否变成"key": 123 - YAML 中的注释
# ...必须在替换前全部删掉,Sublime 正则无法安全跳过它们参与匹配
真正麻烦的不是正则写法,而是 YAML 原文是否严格遵循规范 —— 比如锚点(&ref)、合并()、多行字符串(<code>| 或 >)这些 Sublime 正则根本没法处理,遇到就得停手改用 yaml2json 命令行工具。











