如何安全转换 JSON 与 YAML
选择方向、粘贴源文档并执行转换。YAML 侧只接受 JSON 能表达的标量、序列和映射,避免 JavaScript 专用标签和不明确的自动类型。
- 需要更适合人工阅读的配置时选择 JSON 转 YAML,需要 API 数据时选择 YAML 转 JSON。
- 粘贴一个完整文档;JSON 必须有效,YAML 必须符合本页受限 Schema。
- 转换后检查嵌套对象和数组;无循环别名会展开为普通 JSON 数据。
- 复制前处理大整数、危险键、自定义标签、循环或不支持值的提示。
案例与预期行为
| 输入 | 输出 | 说明 |
|---|---|---|
{"name":"api","ports":[80,443]} |
name: api
ports:
- 80
- 443 |
对象变为映射,数组变为 YAML 序列。 |
enabled: true
retries: 3 |
{
"enabled": true,
"retries": 3
} |
布尔值和数字保持 JSON 兼容类型。 |
message: 你好 👋 |
{"message":"你好 👋"} |
中文和 Emoji 在两个格式中都保持 Unicode。 |
date: 2026-07-29 |
{"date":"2026-07-29"} |
受限 Schema 下,日期样式文本仍是字符串。 |
payload: !!js/function function(){} |
拒绝该 YAML |
不允许 JavaScript 专用标签。 |
__proto__:
polluted: true |
拒绝危险键 |
生成 JSON 前会阻止原型相关键。 |
支持的数据模型与 Schema
转换器使用 js-yaml 的 JSON_SCHEMA,而不是更宽泛的默认 Schema。支持映射、序列、字符串、有限数字、布尔值和 null,与 JSON 基础数据模型一致。这样可避免自动构造 Date、二进制对象、正则表达式或 JavaScript 专用值。
YAML 语言比 JSON 大得多,因此不是所有合法 YAML 都会被本页接受。自定义标签、实现特定类型和无法稳定表示为 JSON 的值会被拒绝。如果目标产品依赖特殊标签,应使用该产品自己的解析器并审查其安全模型。
- 映射键必须能作为 JSON 字符串键。
- 不支持非有限数字、函数、Symbol 和 undefined。
- 日期样式标量在此 Schema 下保持字符串。
映射、序列、锚点与别名
JSON 对象对应 YAML 映射,数组对应序列。属性顺序通常按 JavaScript 对象顺序保留,但不应让业务语义依赖键顺序。YAML 别名可能创建共享引用,转换器会遍历结果并在生成普通 JSON 数据时检查循环。
无循环别名在 JSON 中只能复制被引用的数据,因为 JSON 没有别名语法。自引用或互相引用的图无法用 JSON 表示,会作为循环别名拒绝。JSON 转 YAML 时关闭自动引用生成,避免产生意外锚点。
- 别名属于 YAML,不属于 JSON。
- 循环对象会在 JSON.stringify 前被拒绝。
- 键顺序通常只是展示细节。
原型污染与危险键
__proto__、prototype 和 constructor 在不安全对象合并中经常与原型污染漏洞有关。本工具会在任意层级阻止这些名称,并用无原型对象重建映射,避免转换步骤创建继承属性或修改 Object.prototype。
这只是纵深防御,不能代替最终应用的安全处理。复制后的数据可能被另一个解析器或合并工具以不同方式处理。目标系统仍应采用允许列表 Schema,避免把任意键递归合并到权限对象或应用默认配置。
- 不要把不可信配置直接深度合并到默认对象。
- 在目标系统校验允许的字段名和类型。
- 持续更新 YAML 解析依赖并关注安全公告。
常见转换用途
常见用途包括把 JSON API 示例转为文档或配置草稿,把 YAML 设置转为 API 请求和测试夹具,以及理解缩进、序列和映射在两种语法中的对应关系。
生产配置仍需额外复核:注释可能丢失,引用和引号规则可能改变,目标产品还会有自己的 Schema。不同 YAML 实现的隐式类型规则并不完全一致,最终应使用实际消费软件测试。
- 把 YAML 草稿转为 JSON 请求。
- 把 JSON 示例转为更易读的文档。
- 检查标量实际是字符串、数字、布尔值还是 null。
- 在进入只支持 JSON 的系统前展开别名。
错误与兼容边界
错误包括 JSON 语法无效、YAML 缩进或引号错误、不支持标签、危险键、不可表示值和循环别名。制表符缩进、冒号后缺空格以及序列标记未对齐很常见。应先修复首个结构错误。
转换不会保留 YAML 注释、锚点名称、标量样式、指令和精确空白,也不处理多个 --- 分隔文档。合并键和产品专用隐式类型可能与目标解析器不同,因此本页适合 JSON 兼容数据交换,不是无损 YAML 格式化器。
- 注释无法进入 JSON,因此会丢失。
- !!js/function 等标签会被拒绝。
- 部署前必须用目标应用验证生成配置。
安全、隐私与资源限制
解析和序列化都发生在当前浏览器标签页,不主动上传或持久化文档。解析器使用受限 Schema,解析后还会检查危险键、不支持对象和循环,不启用可执行 JavaScript 类型。
超大的别名图和深层嵌套仍可能消耗大量内存。不应在高权限工作站中随意处理无大小限制的攻击者文件。本地处理也无法阻止录屏、剪贴板历史和扩展读取,分享结果前应移除凭据。
- 自建系统接受 YAML 时应设置大小和深度限制。
- 文本格式不代表天然安全。
- 密钥和私有配置不要进入截图和工单。
与格式化器和 CSV 工具的区别
JSON 格式化器只改变空白,仍保持 JSON;本页改变序列化语言,因此无法字节级保留原文。JSON 与 CSV 转换器要求表格记录并需要定义表头和嵌套值策略,而 YAML 能保留完整嵌套结构。
需要特殊标签、多文档流或产品合并语义时,应使用产品专用 YAML 校验器;需要字段规则时使用 Schema 校验;仅 JSON 语法错误时先用 JSON 格式化器。选择最窄工具更容易理解错误。