# YAML 转 JSON — JSON 也能转回 YAML

两个方向都有，而且会告诉你各自的代价。这些都不会粘进别人的服务器。

> 在浏览器中将支持的 YAML 1.2 子集转换为 JSON，也可将 JSON 转回 YAML。拒绝锚点、别名、标签和多文档流；JSON 会丢失注释。不会上传内容。

这是一个浏览器交互工具，地址是 https://abox.tools/zh/yaml-to-json/。文件在运行该浏览器的设备上处理。主动分享和可选联网功能都在页面上说明。下文是它的文字说明；使用工具请打开该地址。

## 你的 YAML 和 JSON **在浏览器里处理**，无须上传处理。

转换是对一段字符串做算术，就在这里，在这个页面上。两个解析器都是手写的，都在 `src/` 里——`shared/parse-yaml.js` 和 `shared/parse-json.js`——除此之外再没有别的。这个工具压根就没有网络功能，没有要取的，也没有要发的。这一点在这里比本站几乎任何地方都更要紧：一份 YAML 文件多半是部署配置，而部署配置多半塞满了主机名、桶名和密钥。

- ✗ 不上传
- ✗ 不注册
- ✗ 无大小限制
- ✓ 断网可用
- ✓ 开源

## 不上传就把 YAML 转成 JSON 的步骤

1. **选方向。** *YAML 转 JSON* 或者 *JSON 转 YAML*。菜单下面那行小字会在你粘任何东西之前，而不是之后，告诉你这个方向会丢什么。
2. **粘进来，或者把文件放上去。** 能选中能复制的都行。把文件放到选择框上，你自己的浏览器会读它并填进输入框——这里没有上传这一步可以省略——而 `.json` 或 `.yaml` 的后缀顺便就把方向定好了。
3. **选缩进。** 两个空格、四个空格，或者一个制表符。制表符只对 JSON 提供：YAML 是按空格定义的，制表符在它里面不是合法缩进。
4. **在出错的地方读错误。** 在这里失败的解析器会告诉你它遇到了什么，在第几行第几列，而不是“位置 4193 处有意外的 token”。通常这就够你修好一份配置文件，不用再打开别的东西。
5. **把结果拿走。** 复制，或者下载成文件，文件名按它出来的格式取。

## 说得更细的版本

[如何互转 YAML 与 JSON](https://abox.tools/zh/guides/convert-yaml-and-json/): 在浏览器中将支持的 YAML 子集转为 JSON，也可将 JSON 转为 YAML。复用前检查注释丢失、未支持的结构和精确数字文本。

## 工具箱里还有

- [XML 格式化](https://abox.tools/zh/xml-formatter/): 排开了好读的 XML，压平了好发的 XML，还有两个方向的 JSON 转换。这些都不会粘进别人的服务器。
- [文本比对](https://abox.tools/zh/text-diff/): 两段文本进来，每处差异都被标出来，逐行、逐词。没有一个字被贴进别人的服务器。
- [Base64 编码解码](https://abox.tools/zh/base64/): Base64、百分号编码、HTML 实体、十六进制和反斜杠转义，双向都行。没有一个字被贴进别人的服务器。
- [文本与文件分享](https://abox.tools/zh/share-text/): 分享只活在这个打开的标签页里。读的人从你的浏览器直接取走加密内容，关掉标签页就结束——任何服务器上都不留一点东西。

## 常见问题

### 我的 YAML 会被上传到什么地方吗？

不会。这个页面上的两个解析器和两个打印器，都是在你自己的浏览器里、你自己的硬件上跑的函数。这个工具压根就没有网络功能，从不取任何东西，也从不发任何东西，页面的 `Content-Security-Policy` 里写着它允许联系的每一个地址，没有一个属于本站。这正是拿它处理部署配置的理由：那种文件里塞满主机名、桶名，偶尔还有某人打算挪走的密钥，把它粘进别人的转换器，就是把它给了对方。

### 把 YAML 转成 JSON 会丢什么？

JSON 会丢失注释。本解析器有意只支持 YAML 1.2 的子集，拒绝锚点、别名和标签，而不是替你决定展开方式或类型转换。JSON 表示值的树状结构；YAML 还可表示共享节点和带类型的值。多文档流也会被拒绝，不会擅自包进数组。JSON 转 YAML 保留所表示的值。[YAML 规范](https://yaml.org/spec/1.2.2/)定义了更完整的格式。

### 我的 YAML 里写的是 no，JSON 出来却是字符串。为什么？

YAML 1.1 将 `yes`、`no`、`on` 和 `off` 当作布尔值，导致挪威国家代码变成 `false`。本工具支持的子集使用 YAML 1.2 规则：这些词保留为字符串，`true` 和 `false` 是布尔值，`null` 和 `~` 是 null，数字标量是数字。YAML 输出会为歧义词加引号，以兼容仍使用旧规则的读取器。

### 它会保持我的键顺序吗？

会，两个方向都会，而这比听上去难。建立在 `JSON.parse` 上的转换器会悄悄把看着像整数的键挪到前面，于是 `{"10":a,"2":b}` 回来就成了 `{"2":b,"10":a}`。数字保留你打的每一位，所以一个二十位的账号不会因为双精度浮点丢掉最后三位。如果你*就是想*排序，有个勾选框，而且它按键读起来的样子排，不是按码位。

### 能一次转换好几份 YAML 文档吗？

不能，而且它会直说，而不是替你挑一份。带 `---` 分隔符的文件装着不止一份文档，而 JSON 没有哪种形状表示“好几份文档”——用数组的话，就成了这份文件从没做过的断言。一份一份转。

### 这里为什么没有 YAML 格式化？

因为 YAML 没有值得一写的压缩形式——短的那种是流式风格，读不了，而读不了正是把文件留成 YAML 这件事的反面。排开 JSON、XML、HTML 和 CSS 是 [JSON 格式化](https://abox.tools/zh/json-formatter/)的活儿，而且它也排 YAML。

### 文件最大能有多大？

这里没有设限，因为没有服务器在为此付钱。真正的上限是你自己的设备：几兆字节的 YAML 没问题，文档很长的时候，页面会等你打字停下来再转换，而不是跟你抢键盘。

### 免费吗？需要注册吗？

免费，没有账号，不用登录，没有试用期，也不限制你粘多少。本站有广告，站点靠它维持；广告拿不到关于你文本的任何东西。

### 断网还能用吗？

能。页面加载一次之后拔掉网线，它照样工作。这也是证明没有上传的最简单办法：一个把你的配置送出去转换的工具，在你拔线的那一刻就停了。

## 这条隐私承诺怎么核实

- **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果，处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地，但已允许的主机仍可接收请求。策略不检查载荷，不能单独证明什么都没有发出。请把具体操作的请求与源码核对，或断网完成该本地操作。
- **这里不会去取任何东西。** `src/` 里哪儿都没有 `fetch`，没有 `XMLHttpRequest`，也没有 `sendBeacon`。两个解析器和两个打印器都是这个页面里的函数：进去一段字符串，出来一段字符串。
- **支持的子集使用 YAML 1.2 标量规则。** 在 YAML 1.1 里，`no` 是个布尔值，这就是那个著名的坑：挪威的国家代码会变成 `false`。这里读的是 1.2，在那里它就是它看上去的那个字符串。反过来的时候，这些词会*带引号*写回去，因为下一个打开这份文件的东西可能还是个 1.1 的读取器。`tests/js/text-convert.test.js` 两头都查。
- **没法诚实的转换，宁可停下来。** JSON 会丢失注释。本解析器有意只支持 YAML 1.2 的子集，拒绝锚点、别名和标签，而不是替你决定展开方式或类型转换。JSON 表示值的树状结构；YAML 还可表示共享节点和带类型的值。多文档流也会被拒绝，不会擅自包进数组。JSON 转 YAML 保留所表示的值。
- **Google 加载了什么，又没拿到什么。** 广告和统计脚本来自 Google，捐赠按钮来自 Buy Me a Coffee。它们谁也没拿到你文本里的一个字符。读它、解析它、写它的每一行代码，都从这个源提供，也都列在仓库里。
- **断网可用。** 拔掉网线，这个工具一点变化都没有，因为它里面本来就没有联网这一步。这是最简单的证明。

**你可以自己核对。**上面这些不用你信。这个页面是仓库里的模板和配置生成出来的，构建脚本你能读，也能自己跑一遍，跑出来的结果就提交在 `dist` 分支上。拿实际发给你的内容，跟你自己从源码构建出来的结果对一遍就知道了： https://github.com/A-Box-of-Tools/website

最值得先读的几个文件：`config/site.toml` 里是 Content-Security-Policy，宁可拒绝一个锚点也不去猜它想说什么的读取器在 `src/shared/parse-yaml.js`；一次转换为什么就是一个解析器加一个打印器、中间没有任何同时认得两种格式的东西，在 `src/convert.js`。
