跳到主要内容
数据处理2026-06-125 分钟阅读

在线 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 对比

特性JSONYAML
可读性中等高(缩进结构)
注释❌ 不支持✅ # 注释
文件大小较大较小
解析速度快较慢
数据类型基本类型丰富(日期、引用等)
生态系统Web 标准DevOps 常用
安全性✅ 无代码执行风险⚠️ 有代码执行风险

为什么需要 JSON/YAML 转换

  1. Docker Compose:YAML 配置 ↔ JSON 程序化生成
  2. Kubernetes:YAML 清单 ↔ JSON API 请求
  3. CI/CD:GitHub Actions YAML ↔ JSON schema 验证
  4. 配置管理:不同工具使用不同格式
  5. API 文档:OpenAPI 规范支持 JSON 和 YAML
  6. 数据交换:不同系统间的数据格式转换

安全注意事项

⚠️ YAML 的安全风险:YAML 支持 !!js/function 等标签,可能导致代码执行。解析不可信的 YAML 数据时,务必禁用代码执行功能。

# 危险:YAML 可能执行代码
!!js/function |
  function() { return process.env.SECRET; }

如何使用在线工具

使用 ToolVault 工具匣 的 JSON/YAML 转换器:

  1. 粘贴 JSON 或 YAML 数据
  2. 工具自动检测格式并转换
  3. 支持自定义缩进和格式选项
  4. 实时显示转换结果
  5. 语法错误检测

需要给人改的配置草稿时,优先 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 ComposeYAMLdocker-compose.yml
KubernetesYAML*.yaml
GitHub ActionsYAML.github/workflows/*.yml
package.jsonJSONpackage.json
tsconfig.jsonJSONtsconfig.json
Nginx自定义nginx.conf
GitLab CIYAML.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 工具匣 提供。更多免费本地工具见 首页。