JSON 转 YAML 转换器
粘贴 JSON 即时获得 YAML,浏览器端实时转换。支持 Kubernetes、Docker Compose 和 Terraform,提供 2/4 空格缩进、Norway 安全自动引号,100% 隐私保护,数据不离开设备。
什么是 YAML?为什么要从 JSON 转换?
YAML(YAML Ain't Markup Language,YAML 不是标记语言)是一种人类可读的数据序列化格式,专为配置文件、基础设施即代码以及任何由人工编写、机器读取的数据场景而设计。其基于缩进的语法无需花括号或方括号,使复杂嵌套结构比 JSON 更易阅读。Kubernetes、Helm、Ansible、Docker Compose、GitHub Actions、CircleCI 以及几乎所有云原生工具都以 YAML 作为主要配置格式。因此,将 JSON 转换为 YAML 是 DevOps 和后端开发中最常见的任务之一 — 你从 API 以 JSON 格式获取资源定义,需要 YAML 清单提交到版本控制。
与典型的在线转换器相比,本工具有四个重要差异点:
**1. Norway 问题 — 自动安全引号。** JSON 转 YAML 最大的坑是 YAML Norway 问题。在 YAML 1.1 中(大量生产环境解析器仍在使用,包括旧版 Kubernetes、PyYAML、Ansible 和 Ruby 的 Psych),裸字符串 yes、no、on、off、y 和 n 被解析为布尔值 true/false。这个问题在挪威的 ISO 国家代码上闻名于世("NO" → false),并在 Kubernetes 配置中造成了真实的生产故障。YAML 1.2 已修复此问题,但你的解析器可能尚未升级。本工具默认的「自动」引号模式使用带 YAML 1.1 schema 的 eemeli/yaml 库,自动为所有 Norway 问题字符串加上引号,确保在 YAML 1.1 和 1.2 解析器中都能安全往返。详见我们的配套文章 YAML Norway 问题与 JSON-YAML 差异详解。
**2. 键顺序保留。** 与某些按字母排序键的转换器不同,本工具保留 JSON 中原始的键插入顺序,与所有现代 JavaScript 引擎中 JSON.parse() 的行为一致。这对 Kubernetes 清单(按惯例 apiVersion 和 kind 应在最前)、OpenAPI 规范(info 在 paths 之前)以及任何字段顺序对可读性或 diff 有意义的配置都很重要。
**3. 大数字精度说明。** 大于 2^53 - 1(9007199254740991)的 JSON 数字无法在 JavaScript 的 IEEE 754 双精度浮点数中精确表示。当 JSON.parse() 读取大整数(如服务器端是 64 位整数的 Kubernetes resourceVersion 字段)时,会静默截断。这是影响所有基于浏览器的 JSON 工具的根本限制,包括本工具。安全的解决方法是在转换前确保大整数以字符串形式存储在 JSON 中。本工具在下方「数字精度丢失」常见错误中诚实地记录了此行为。
**4. 100% 浏览器端隐私保护。** 你的 JSON 数据(通常包含 API 密钥、数据库凭证、内部服务配置和生产密钥)永远不会离开浏览器。数据不会发送到任何服务器。你可以通过浏览器的「网络」标签验证这一点。这是在线工具中处理敏感配置数据的唯一安全方式。反向工具请见 YAML 转 JSON 转换器,如需在转换前验证和美化 JSON,请使用 JSON 格式化工具。
YAML 的人类可读性也伴随着更多的解析边界情况:除了 Norway 问题,还有八进制数字怪癖(YAML 1.1 中 0777 被解析为 511)、多行字符串语法(| 字面量,> 折叠)、锚点和别名引用(&anchor 和 *alias),以及多文档支持(--- 分隔符)。JSON 没有这些复杂性 — 它是一种严格、最简的格式,只有六种数据类型。对于机器间数据交换,JSON 几乎总是更好的选择。对于人工编辑的配置文件(可读性和注释更重要),YAML 胜出。本转换器给你两全其美:以 JSON 方式编程操作,转换为 YAML 用于基础设施配置。
// Convert JSON to YAML in Node.js using the eemeli/yaml library
import { Document } from 'yaml';
const data = JSON.parse('{"apiVersion":"apps/v1","kind":"Deployment"}');
// version: '1.1' ensures Norway-problem strings (yes/no/on/off/y/n)
// are automatically quoted in the output for YAML 1.1 parser safety
const doc = new Document(data, { version: '1.1' });
const yamlString = doc.toString({
indent: 2,
lineWidth: 0, // disable line wrapping
defaultStringType: 'PLAIN', // Auto mode: only quote when needed
});
console.log(yamlString);
// apiVersion: apps/v1
// kind: Deployment 核心功能
实时转换
输入或粘贴 JSON 时,YAML 输出即时更新 — 无需点击「转换」按钮。大型输入(>200KB)自动切换为手动模式以保持浏览器响应。
2 或 4 空格缩进
在 2 空格(Kubernetes、Docker Compose 和 GitHub Actions 的标准)和 4 空格(Ansible 惯例)之间切换。YAML 禁止使用制表符 — 本工具始终使用空格。
自动安全引号(Norway 安全)
默认的「自动」模式使用 YAML 1.1 模式,自动为 "no"、"yes"、"on"、"off"、"y" 和 "n" 等字符串加引号,防止 YAML 1.1 解析器将其误读为布尔值,避免生产配置错误。
块状和流式风格
块状风格生成缩进的、人类可读的 YAML,适合清单和配置文件。流式风格生成紧凑的内联 YAML,类似 JSON — 适用于文档片段或偏好最小化输出的工具。
100% 浏览器端隐私
所有转换均在浏览器中使用 JavaScript 本地运行。你的 JSON 数据(包括 API 密钥、凭证和生产配置)不会发送到任何服务器,不会被记录,也不会被存储。
支持 K8s、Compose 和 Terraform 文件
针对真实 DevOps 场景优化:Kubernetes 清单、Docker Compose 栈、Helm chart values、GitHub Actions 工作流、OpenAPI 规范和 Terraform JSON 计划输出 — 每种场景均附有示例。
示例
Kubernetes Deployment
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"my-app","namespace":"production","labels":{"app":"my-app","version":"1.0.0"}},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"my-app"}},"template":{"metadata":{"labels":{"app":"my-app"}},"spec":{"containers":[{"name":"my-app","image":"my-app:1.0.0","ports":[{"containerPort":8080}],"resources":{"requests":{"memory":"64Mi","cpu":"250m"},"limits":{"memory":"128Mi","cpu":"500m"}}}]}}}} 将 JSON API 响应格式的 Kubernetes Deployment 清单转换为 YAML,以便通过 kubectl apply -f 部署
Docker Compose
{"version":"3.9","services":{"web":{"image":"nginx:1.25-alpine","ports":["80:80","443:443"],"environment":{"NGINX_HOST":"example.com","NGINX_PORT":"80"},"depends_on":["db"],"restart":"unless-stopped"},"db":{"image":"postgres:16-alpine","environment":{"POSTGRES_DB":"mydb","POSTGRES_USER":"admin","POSTGRES_PASSWORD":"secret"},"volumes":["pgdata:/var/lib/postgresql/data"]}},"volumes":{"pgdata":{}}} 将 Docker Compose 服务定义从 JSON 转换为 docker compose up 所需的 YAML 格式
GitHub Actions 工作流
{"name":"CI","on":{"push":{"branches":["main"]},"pull_request":{"branches":["main"]}},"jobs":{"build":{"runs-on":"ubuntu-latest","steps":[{"uses":"actions/checkout@v4"},{"name":"Set up Node.js","uses":"actions/setup-node@v4","with":{"node-version":"20","cache":"pnpm"}},{"name":"Install dependencies","run":"pnpm install --frozen-lockfile"},{"name":"Run tests","run":"pnpm test"}]}}} 将 GitHub Actions CI 工作流定义从 JSON 转换为 YAML,提交到 .github/workflows/
OpenAPI 规范
{"openapi":"3.0.3","info":{"title":"User API","version":"1.0.0","description":"Manage application users"},"paths":{"/users":{"get":{"summary":"List users","operationId":"listUsers","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":20}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/User"}}}}}}}},"/users/{id}":{"get":{"summary":"Get user","operationId":"getUser","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success"}}}}},"components":{"schemas":{"User":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","format":"email"}}}}}} 将 OpenAPI 3.0 规范从 JSON 转换为 YAML — Swagger UI、Redoc 和大多数 API 工具链的首选格式
package.json
{"name":"my-app","version":"1.0.0","description":"A sample Node.js application","private":true,"scripts":{"dev":"vite","build":"tsc && vite build","preview":"vite preview","test":"vitest","lint":"eslint . --ext .ts,.tsx"},"dependencies":{"react":"^18.3.0","react-dom":"^18.3.0"},"devDependencies":{"typescript":"^5.4.0","vite":"^5.2.0","vitest":"^1.5.0","eslint":"^8.57.0","@types/react":"^18.3.0"},"engines":{"node":">=20.0.0","pnpm":">=9.0.0"}} 将典型的 Node.js package.json 转换为 YAML — 适用于迁移偏好 YAML 的项目配置工具
Terraform JSON 计划
{"format_version":"1.0","terraform_version":"1.7.4","variables":{"region":{"value":"us-east-1"}},"planned_values":{"root_module":{"resources":[{"address":"aws_s3_bucket.main","mode":"managed","type":"aws_s3_bucket","name":"main","values":{"bucket":"my-app-assets","force_destroy":false,"tags":{"Environment":"production","ManagedBy":"terraform"}}}]}},"resource_changes":[{"address":"aws_s3_bucket.main","mode":"managed","type":"aws_s3_bucket","name":"main","change":{"actions":["create"],"before":null,"after":{"bucket":"my-app-assets","force_destroy":false}}}]} 将 Terraform JSON 计划输出转换为 YAML,便于人工审查、GitOps 审计和 CI/CD 流水线使用 — 大多数转换工具缺失的功能
使用方法
- 1
粘贴 JSON 数据
在上方输入框中输入或粘贴 JSON 数据。也可以点击「加载示例」试用 Kubernetes Deployment、Docker Compose 文件或 Terraform 计划等示例。
- 2
查看实时 YAML 输出
YAML 会即时显示在输出面板中。调整选项(缩进 2/4、引号自动/双引号/单引号、风格块状/流式)以匹配目标工具的要求。
- 3
复制或下载
点击「复制」将 YAML 复制到剪贴板,或点击「下载」将其保存为 .yaml 文件,可直接用于 kubectl apply、docker compose up 或其他工具。
常见转换问题
尾随逗号
JSON 不允许在对象或数组的最后一个元素后面添加逗号。从 JavaScript 代码复制时极为常见,因为 JavaScript 允许尾随逗号。转换前请删除末尾逗号。
{"name": "Alice", "role": "admin",} {"name": "Alice", "role": "admin"} 单引号
JSON 要求所有字符串值和对象键使用双引号。单引号在 JavaScript 和 Python 中有效,但在 JSON 中是语法错误。
{'name': 'Alice', 'active': true} {"name": "Alice", "active": true} 未加引号的键名
所有 JSON 对象键必须用双引号括起来。未加引号的键名在 JavaScript 对象字面量中有效,但在严格 JSON 中会导致解析错误。
{name: "Alice", role: "admin"} {"name": "Alice", "role": "admin"} 不允许注释
标准 JSON 不支持任何形式的注释 — 不支持 //、/* */ 或 #。如需在配置中添加注释,请使用 YAML(支持 # 注释)或 JSONC(带注释的 JSON,VS Code 使用)。将数据用作 JSON 前请删除所有注释。
{"port": 8080 // HTTP port} {"port": 8080} YAML Norway 问题(自动模式已自动处理)
在 YAML 1.1 解析器中(Kubernetes、Ansible、PyYAML、Ruby Psych 使用),裸字符串 yes、no、on、off、y 和 n 会被解析为布尔值 true/false 而非字符串。本工具的「自动」模式会在 YAML 输出中自动为这些值加引号,确保在任何 YAML 1.1 或 1.2 解析器中都能安全往返。如果选择「双引号」或「单引号」模式,所有字符串都会被明确加引号,同样可以避免此问题 — 但「自动」模式的输出更自然。
# JSON input: {"country": "no", "enabled": "yes"}
# YAML without quoting (dangerous):
country: no
enabled: yes
# YAML 1.1 parser reads: country=false, enabled=true # YAML with Auto quoting (safe): country: 'no' enabled: 'yes' # YAML 1.1 parser reads: country="no", enabled="yes"
大整数精度丢失
JavaScript 只能精确表示 2^53 - 1(9007199254740991)以内的整数。大于此值的 JSON 整数(如服务器端为 int64 的 Kubernetes resourceVersion 字段)在 JSON.parse() 解析时会被静默取整,截断后的数字随后出现在 YAML 输出中。这是影响所有基于浏览器的 JSON 工具的根本限制。安全的解决方法是在转换前将大整数以字符串形式存储在 JSON 中。
// JSON input (resourceVersion is int64 on K8s server)
{"resourceVersion": 9007199254740993}
// JavaScript reads it as: 9007199254740992 (precision lost)
// YAML output will contain the wrong number // Store large integers as strings to preserve precision
{"resourceVersion": "9007199254740993"}
// YAML output: resourceVersion: '9007199254740993' (exact) 常见使用场景
- Kubernetes 清单
- 将 kubectl get -o json 或 Kubernetes API 的 JSON 响应转换为 YAML 清单,用于 GitOps 工作流、Kustomize overlay 和 kubectl apply -f 部署。
- Docker Compose 文件
- 将 docker inspect JSON 输出或以编程方式生成的服务配置转换为兼容 docker compose up 和 Docker Stack 部署的 docker-compose.yaml 文件。
- Helm Chart Values
- 将 JSON 配置导出转换为 Helm chart 部署的 YAML values 文件,以清晰的 YAML 语法实现版本控制的基础设施配置。
- GitHub Actions 工作流
- 以 JSON 方式以编程方式构建 GitHub Actions 工作流定义,再转换为 GitHub Actions 运行器所需的 .github/workflows/*.yaml 格式。
- OpenAPI 规范
- 将许多框架(FastAPI、SpringDoc)返回的 JSON 格式 OpenAPI/Swagger 规范转换为 Swagger UI、Redoc 和 API 网关工具首选的 YAML 格式。
- 配置迁移
- 将存储在 JSON 中的应用配置(appsettings.json、config.json)迁移到 YAML 格式,适配需要或偏好 YAML 的工具,并可使用注释进行文档说明。
技术细节
- 符合 RFC 8259 的 JSON 解析
- JSON 输入使用浏览器原生的 JSON.parse() 解析,完全符合 RFC 8259 标准。提供准确的语法错误信息(包含位置信息:尽力提供行号和列号),并处理所有 JSON 数据类型:字符串、数字、布尔值、null、数组和对象。
- 通过 eemeli/yaml Document API(YAML 1.1 Schema)生成 YAML 1.2 输出
- YAML 通过 eemeli/yaml 库(v2.8+,CVE 安全)使用 version: '1.1' 的 Document API 生成。这种组合产生 YAML 1.2 兼容的输出,同时应用 YAML 1.1 引号规则 — 即 Norway 问题字符串(yes/no/on/off/y/n)在输出中自动加引号,对 YAML 1.1 和 1.2 解析器均安全。行宽禁用(lineWidth: 0)以保持长字符串完整。
- 100% 浏览器端 — 无上传,无服务器
- 所有处理完全在浏览器的 JavaScript 引擎中完成。数据在任何时候都不会通过网络传输。超过 200KB 的输入会自动从实时模式切换到手动模式(需要显式点击「转换」),以保持浏览器响应并防止繁重序列化时主线程阻塞。
最佳实践
- DevOps 配置始终使用「自动」引号模式
- 将 JSON 转换为 Kubernetes、Helm、Ansible、Docker Compose 或 GitHub Actions 使用时,始终使用默认的「自动(Norway 安全)」引号模式。这些工具中的 YAML 1.1 解析器会静默地将裸字符串 yes、no、on、off、y 和 n 误读为布尔值 — 「自动」模式可透明地防止此问题。
- 云原生工具使用 2 空格缩进
- Kubernetes、Docker Compose、GitHub Actions 和 Helm 按惯例均使用 2 空格缩进。在这些文件中使用 4 空格缩进虽然是有效的 YAML,但会与社区示例、自动生成的配置以及团队现有清单产生不一致。
- 转换前将大整数存储为字符串
- Kubernetes 的 resourceVersion、uid 和其他来自 API 服务器的 int64 字段可能超过 JavaScript 的安全整数范围(2^53 - 1)。如需精确数值,在转换前将这些值以 JSON 字符串形式存储。这对包含服务器端生成字段的 kubectl get -o json 输出尤为重要。
- 先验证 JSON
- 如果 JSON 来源是手写的,或来自偶尔会产生无效输出的系统(尾随逗号、未加引号的键、注释),请先用 JSON 格式化工具验证。使用我们的 JSON 格式化工具先发现并修复语法错误,再将干净的 JSON 转换为 YAML。
- 提交版本控制的文件优先使用块状风格
- 块状风格 YAML 在 Git 中生成清晰、人类可读的 diff,因为每个字段都单独占一行。流式风格(紧凑的内联格式)使 diff 更难阅读和审查。将流式风格保留用于在文档中嵌入短 YAML 片段或需要紧凑输出的工具。
常见问题
如何在线将 JSON 转换为 YAML?
什么是 YAML Norway 问题?本工具如何处理?
Norway 问题对 Kubernetes 和 DevOps 有何影响?
YAML 应该用 2 空格还是 4 空格缩进?
如何用本工具创建 Kubernetes 清单?
如何将 Docker Compose JSON 转换为 YAML?
大于 2^53 的 JSON 数字在转换为 YAML 时会丢失精度吗?
转换器是否保留 JSON 中原始的键顺序?
何时应该使用 JSON 而非 YAML?
如何在命令行中将 JSON 转换为 YAML?
如何在 Python、Node.js 或 Go 中将 JSON 转换为 YAML?
使用本工具时 JSON 数据会上传到服务器吗?
JSON 输入有文件大小限制吗?
相关工具
查看所有工具 →Base64 解码与编码工具
编码和格式化
免费在线 Base64 解码编码工具。实时转换,支持中文和 Emoji,100% 浏览器端运行,数据不离开设备,无需注册。
JSON 格式化与验证工具
编码和格式化
在浏览器中即时格式化、验证和美化 JSON。免费在线工具,支持语法验证、错误检测、压缩和一键复制,100% 隐私保护。
URL 编码解码在线工具 — 内置 URL 结构解析
编码和格式化
粘贴 URL 即时编码或解码,实时显示结果。内置 URL 解析器将协议、域名、路径、查询参数拆解为可编辑字段。支持 encodeURI 和 encodeURIComponent 双模式切换,检测双重编码问题。纯浏览器端运行,数据不离开设备。
YAML 转 JSON 转换器
编码和格式化
粘贴 YAML 即时获得 JSON,浏览器端实时转换。支持 K8s 清单、OpenAPI 规范、Helm values 和 Ansible playbook,完整展开锚点/别名,100% 隐私保护,数据不离开设备。
进制转换器 — 二进制、十六进制、十进制、八进制互转
转换工具
在线免费进制转换工具,支持二进制、八进制、十进制、十六进制及 2-36 任意进制互转。无需注册,数据不离开浏览器,即时获取结果。
在线压缩 JPEG、PNG、WebP 图片 — 免费批量处理
转换工具
免费在线压缩 JPEG、PNG、WebP 图片,体积缩小高达 80%。浏览器本地处理、图片不上传服务器。支持批量压缩 20 张、质量调节、前后对比预览。无需注册。