在线 JSON/YAML 转换器:配置文件格式互转工具
什么是 JSON 和 YAML
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,使用大括号和中括号表示结构。
YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,使用缩进表示结构。关于逆向转换(YAML 到 JSON)方向的常见坑,见姊妹篇 YAML 转 JSON 完全指南。
对比示例
JSON:
{
"server": {
"host": "0.0.0.0",
"port": 3000,
"features": ["auth", "logging"]
}
}
YAML:
server:
host: 0.0.0.0
port: 3000
features:
- auth
- logging
JSON vs YAML 对比
| 特性 | JSON | YAML |
|---|---|---|
| 可读性 | 中等 | 高(缩进结构) |
| 注释 | ❌ 不支持 | ✅ # 注释 |
| 文件大小 | 较大 | 较小 |
| 解析速度 | 快 | 较慢 |
| 数据类型 | 基本类型 | 丰富(日期、引用等) |
| 生态系统 | Web 标准 | DevOps 常用 |
| 安全性 | ✅ 无代码执行风险 | ⚠️ 有代码执行风险 |
为什么需要 JSON/YAML 转换
- Docker Compose:YAML 配置 ↔ JSON 程序化生成
- Kubernetes:YAML 清单 ↔ JSON API 请求
- CI/CD:GitHub Actions YAML ↔ JSON schema 验证
- 配置管理:不同工具使用不同格式
- API 文档:OpenAPI 规范支持 JSON 和 YAML
- 数据交换:不同系统间的数据格式转换
安全注意事项
⚠️ YAML 的安全风险:YAML 支持 !!js/function 等标签,可能导致代码执行。解析不可信的 YAML 数据时,务必禁用代码执行功能。
# 危险:YAML 可能执行代码
!!js/function |
function() { return process.env.SECRET; }
如何使用在线工具
使用 ToolVault 工具匣 的 JSON/YAML 转换器:
- 粘贴 JSON 或 YAML 数据
- 工具自动检测格式并转换
- 支持自定义缩进和格式选项
- 实时显示转换结果
- 语法错误检测
需要给人改的配置草稿时,优先 JSON → YAML,并在 CI 里保留一份同库可往返的 JSON 金丝雀。接口、Schema 校验或前端只收 JSON 时,走 YAML → JSON——对不信任输入务必用安全加载器(禁用任意标签)。
本转换器故意不做的事
浏览器转换面向 JSON 兼容子集:JSON 侧会丢掉注释,锚点会展开成重复树,多文档流需要上游先拆。若文件依赖自定义标签或 merge key,把输出当迁移草稿,不要当可直接替换的成品。边界故意划清:静默「几乎正确」的 YAML 比明确子集更危险。
代码中的转换
JavaScript
const yaml = require('yaml');
const fs = require('fs');
// JSON → YAML
const jsonData = { server: { host: '0.0.0.0', port: 3000 } };
const yamlString = yaml.stringify(jsonData);
console.log(yamlString);
// YAML → JSON
const yamlString = 'server:\n host: 0.0.0.0\n port: 3000';
const jsonObj = yaml.parse(yamlString);
console.log(jsonObj);
Python
import json
import yaml
# JSON → YAML
data = {"server": {"host": "0.0.0.0", "port": 3000}}
yaml_str = yaml.dump(data, default_flow_style=False)
# YAML → JSON
yaml_str = "server:\n host: 0.0.0.0\n port: 3000"
data = yaml.safe_load(yaml_str) # 注意使用 safe_load
json_str = json.dumps(data, indent=2)
各工具的配置格式偏好
| 工具 | 常用格式 | 文件扩展名 |
|---|---|---|
| Docker Compose | YAML | docker-compose.yml |
| Kubernetes | YAML | *.yaml |
| GitHub Actions | YAML | .github/workflows/*.yml |
| package.json | JSON | package.json |
| tsconfig.json | JSON | tsconfig.json |
| Nginx | 自定义 | nginx.conf |
| GitLab CI | YAML | .gitlab-ci.yml |
YAML 三特性:JSON 表达不了、转换器必丢的
锚点与别名(&anchor / *alias——共享引用在导出 JSON 时平铺成重复内容,破坏同一性假设);多文档流(--- 分隔——一个 YAML 文件是 N 个 JSON 文档,只输出一份的转换器静默丢掉第 2..N 份或非法拼接);自定义标签(!!timestamp 自动解析日期——JSON 收到的是字符串,往返类型就变了)。安全子集是「当 JSON 的漂亮语法用的 YAML」;一旦文件用了锚点或多文档,转换就是需要人工评审的迁移而非机械变换。
挪威问题:YAML 隐式类型的头号事故源
no 变 false。NO、No、no——全是布尔假;on/off/yes 同理。挪威(NO)与挪威用户深受其害;版本号 1.10 变 1.1(数据损坏不止类型变化);ISO 日期在部分解析器变日期对象、在另一些保持字符串。规模化的缓解:YAML 1.2 核心 schema(更严格)、生成器显式引号(可能解析为布尔/数字的字符串一律加引号——我们的转换器的输出正是这个约定)、CI 里跑一个金丝雀文件的往返校验。仅此一节解释的生产 YAML 事故,比其余各节加起来还多。
转换后怎么做 diff
JSON ↔ YAML 之后,diff 往往比真实变更更吵:缩进风格、键顺序、带引号与裸标量。评审前先把两边规范化成排序键的 JSON,或钉死发射选项(缩进宽度、flow vs block),让 CI diff 更有信号。Kubernetes / Compose 还要对比生效后的对象(控制面看到的),而不只是文件字节——别名与默认值会藏在渲染结果里。
FAQ
JSON 和 YAML 各自适合什么?
没有绝对的好坏。JSON 适合 Web API 和机器处理。YAML 适合人类编辑和配置文件。大多数现代工具两者都支持,需要互转时用 YAML to JSON converter 在浏览器里就能完成。
YAML 转 JSON 会丢失信息吗?
基本不会。但 YAML 的某些特性 JSON 不支持:注释、锚点(&/*)、多文档(---)。转换时这些内容会被忽略。其余内容用一个 JSON to YAML converter 就能在浏览器里同步两种格式。
如何选择缩进大小?
YAML 标准推荐 2 个空格缩进。Kubernetes 社区也使用 2 空格。Docker Compose 默认 2 空格。保持项目内一致即可。
排查注记
「本转换器故意不做的事」把边界划得很直白:JSON 侧丢注释、锚点展开、多文档要上游拆——理由写明「静默『几乎正确』的 YAML 比明确子集更危险」。挪威问题一节自评「仅此一节解释的生产 YAML 事故比其余各节加起来还多」:no 变 false、版本号 1.10 变 1.1,缓解三件套是 YAML 1.2 严格 schema、生成器对可能解析为布尔/数字的标量一律加引号、CI 金丝雀往返校验。锚点、多文档、自定义标签被列为「JSON 表达不了、转换器必丢」的三特性——用了它们的文件,转换是需要人工评审的迁移,不是机械变换。
本文由 ToolVault 工具匣 提供。更多免费本地工具见 首页。
相关工具
相关文章
在线 CSV 转 SQL 工具:将表格数据导入数据库
CSV 转 INSERT:空单元格→NULL、MySQL 反引号或 PostgreSQL 双引号、BOM 剥离、Markdown 竖线转义,以及与 COPY/LOAD 的分工。
HTML 表格转 JSON 怎么保留行列结构?
把网页里的 HTML 表格转成 JSON,怎么保留表头、处理合并单元格、保持嵌套结构?逐步方法并附本站 HTML 表格转 JSON 工具。
Excel 转 JSON 后日期变成数字 / 中文乱码,怎么办?
把 Excel 转成 JSON 时日期变 44927 这种数字、中文乱码、空单元格丢失怎么办?讲清 Excel 日期序列号与编码坑,并附本站 Excel 转 JSON 工具。