JSON vs YAML: 차이점과 변환 시점

두 설정 포맷을 비교하고 K8s, Docker Compose 등에서 YAML 또는 JSON을 언제 사용할지 알아보세요.

同一份配置:API 用 JSON,K8s 用 YAML,CI 里又要互转——选错格式会导致解析失败、注释丢失或部署到错误环境。

本文面向全栈与 DevOps 工程师,对比 JSON 与 YAML 的语法差异、选型原则、5 步安全互转流程及锚点、布尔值等常见陷阱。阅读完成后,你可以用 JSON 工具箱的 JSON ↔ YAML 转换功能,在浏览器本地完成转换与校验。

为什么需要理解 JSON 与 YAML

JSON 是事实上的 API 标准;YAML 是事实上的运维配置语言。团队若在两者间频繁切换却不了解差异,容易出现「本地 YAML 能跑、转成 JSON 后键类型变了」的问题。

例如 Docker Compose 里 ports: "8080:8080" 与 JSON 里数字端口的混用,或 K8s 清单中 yes/no 被 YAML 解析为布尔值,转成 JSON 后客户端行为不一致。

JSON 与 YAML 分别是什么

JSON(JavaScript Object Notation)是严格的、基于文本的数据交换格式:键名必须双引号、不支持注释、适合程序解析。YAML(YAML Ain't Markup Language)以缩进表示层级,支持注释与多种标量写法,更适合人类编写大型配置。

二者关系

YAML 1.2 规范中,JSON 是其子集——大多数合法 JSON 可以直接作为 YAML 解析。但 YAML 独有特性(锚点 &、别名 *、多行字符串 |)在转 JSON 时可能丢失或需展开。

核心差异对比

对比维度JSONYAML
注释❌ 不支持✅ # 行注释
键名引号✅ 必须双引号⚠️ 多数可省略
层级表示大括号 / 方括号缩进(空格)
适合 API 传输✅ 推荐⚠️ 较少
适合手写大配置⚠️ 括号多✅ 推荐
严格性高,解析失败即报错相对宽松,易踩隐式类型坑

谁适合用哪种格式

角色 / 场景推荐格式原因
REST / GraphQL APIJSON生态统一、无歧义
Kubernetes / HelmYAML社区惯例、可注释
Docker ComposeYAML官方示例与文档
package.json / tsconfigJSON工具链原生支持
消息队列 PayloadJSON体积小、解析快

典型场景选型指南

  • 前后端接口契约:JSON
  • GitHub Actions / GitLab CI 部分步骤:YAML
  • 环境变量注入前的静态配置:视团队习惯,YAML 便于注释
  • 需要机器严格校验的结构:JSON + JSON Schema

实操:5 步安全互转

  1. 明确方向:JSON → YAML(便于阅读编辑)或 YAML → JSON(便于 API/程序消费)
  2. 备份原文件:转换前保留一份可回滚的副本
  3. 在 JSON 工具箱转换页粘贴源内容,选择对应方向
  4. 校验结果:JSON 侧用校验工具;YAML 侧注意缩进与类型
  5. 目标环境冒烟:部署或调用一次,确认行为与转换前一致

示例:同一段配置的两种写法

JSON:

{
  "service": "api-gateway",
  "replicas": 3,
  "debug": false,
  "ports": [8080, 8443]
}

YAML:

service: api-gateway
replicas: 3
debug: false
ports:
  - 8080
  - 8443

互转常见陷阱

YAML 隐式类型

  • yes / no / on / off 可能被解析为布尔值
  • 纯数字字符串建议加引号,如 version: "01"
  • null 与 ~ 在 YAML 中表示空值,转 JSON 后为 null

JSON 转 YAML 后的体积

YAML 通常更易读但不一定更短。若仅用于传输,生产环境仍建议 JSON + 压缩。

锚点与别名

YAML 的 &anchor 和 *alias 在转 JSON 时会被展开为重复对象,需确认是否符合预期。

JSON 与 YAML 工具链对比

需求JSON 工具链YAML 工具链
浏览器内互转JSON 工具箱JSON 工具箱
CLI 校验jqyamllint / yq
K8s 应用需先转 YAML 或使用 CRD JSONkubectl apply -f
Schema 约束JSON Schema 成熟较少统一标准

常见问题 FAQ

所有 JSON 都能转成 YAML 吗?

标准 JSON 均可转为等价 YAML。注意转换后键顺序、缩进风格可能与手写 YAML 不同,但不影响语义。

YAML 里的注释会保留到 JSON 吗?

不会。JSON 不支持注释,转换时注释会被丢弃,重要说明请写在文档或 README 中。

K8s 资源用 JSON 可以吗?

可以。kubectl 支持 JSON 清单,但社区示例与 Helm 模板以 YAML 为主,团队协作建议统一格式。

转换失败最常见原因是什么?

JSON 侧:尾逗号、单引号。YAML 侧:缩进混用 Tab 与空格、冒号后缺少空格。

数据会上传到服务器吗?

不会。JSON 工具箱在浏览器本地完成转换,适合内含敏感配置的内网文件(仍建议脱敏)。

转换后必须再校验吗?

建议务必校验。至少执行一次 JSON 语法校验,并在 staging 环境验证配置生效。

总结与下一步

JSON 重严格与互操作,YAML 重可读与运维友好。选型原则:对外接口与程序间通信用 JSON;人工维护的大型静态配置优先 YAML;互转时始终校验并做冒烟测试。

建议在仓库中约定「何种文件必须用哪种格式」,并在 CI 中加入格式校验,避免 YAML 隐式类型导致的生产事故。