# JSON 格式化 — 排好它、压扁它，或者转换它

JSON、XML、HTML、CSS 和 YAML，格式化或转换。没有一个字被贴进别人的服务器。

> 格式化和压缩 JSON、XML、HTML、CSS 和 YAML，把 JSON 转成 YAML 或 XML 再转回来。解析器在你的浏览器里跑，什么都不上传——token 和配置文件从不离开你的机器。

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

## 你的文本和代码**在浏览器里处理**，无须上传处理。

格式化和转换都是对一串字符做算术，就在这个页面里做完。解析器是手写的，都在 `src/` 里：`shared/parse-json.js`、`shared/parse-xml.js`、`css.js`、`shared/parse-yaml.js`；此外别无他物。这个工具没有任何形式的网络功能，没有什么可取，也没有什么可发。这一点在本站几乎别处都不如在这里要紧：人们往格式化器里贴的，是访问令牌、会话 cookie、客户记录，还有尚未发布的代码。

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

## 怎样在不上传的前提下格式化或转换 JSON

1. **选好要做的事。** 两个标签页，一个输入框：“格式化”把 JSON、XML、HTML、CSS 和 YAML 排好或压扁；“转换”把 JSON 变成 YAML 或 XML，再变回来。你刚格式化完的文本就是你要转换的文本，不用贴第二遍。
2. **贴进来，或者把文件拖进来。** 凡是你能选中并复制的都行。拖到选择框上的文件由你自己的浏览器读进输入框：这里根本没有可省略的上传步骤。
3. **让它自己判断语言，或者直接告诉它。** 菜单里写着它把这段文本当成了什么，改正只要一次点击。判断只是个起点，所以它被摆出来，而不是悄悄套用。
4. **选好缩进，或者干脆压平。** 两个空格、四个空格，或者一个制表符。压平就是同一份文档，只是把纯粹为了阅读才存在的空白都去掉，结果里会写明这样省下了多少字节。
5. **在出错的地方读错误。** 这里的解析器失败时，会说它看到了什么，以及在第几行第几列，而不是“位置 4193 处有意外的 token”。通常这就足够把一份配置文件改对，不用再打开别的东西。
6. **把结果带走。** 复制它，或者下载成文件，文件名跟着输出语言走。

## 说得更细的版本

[怎么不把 JSON 交给任何人也能格式化](https://abox.tools/zh/guides/format-json-without-uploading-it/): 在自己的浏览器里排版、检查和压缩 JSON：一个格式化工具绝不该改动你文件的哪些地方、错误信息该怎么读，以及你把东西粘进哪个框里为什么要紧。

## 工具箱里还有

- [YAML 转 JSON](https://abox.tools/zh/yaml-to-json/): 两个方向都有，而且会告诉你各自的代价。这些都不会粘进别人的服务器。
- [XML 格式化](https://abox.tools/zh/xml-formatter/): 排开了好读的 XML，压平了好发的 XML，还有两个方向的 JSON 转换。这些都不会粘进别人的服务器。
- [文本比对](https://abox.tools/zh/text-diff/): 两段文本进来，每处差异都被标出来，逐行、逐词。没有一个字被贴进别人的服务器。
- [Base64 编码解码](https://abox.tools/zh/base64/): Base64、百分号编码、HTML 实体、十六进制和反斜杠转义，双向都行。没有一个字被贴进别人的服务器。

## 常见问题

### 我的文本会被传到哪里去吗？

不会。这个页面上的每个解析器和写出器，都是在你自己的浏览器里、你自己的硬件上运行的函数。这个工具没有任何形式的网络功能：它从不去取什么，也从不发出什么；页面的 `Content-Security-Policy` 里写着它允许联系的每一个地址，没有一个属于本站。这正是拿它来处理访问令牌、会话 cookie 或客户记录的理由：把这类东西贴进别人的格式化器，等于把它交给了对方。

### 格式化 JSON 除了排版之外还会改动什么吗？

不会，而这比听上去难。键会保持你写的顺序：建在 `JSON.parse` 上的格式化器会悄悄把像整数的键挪到前面，于是 `{"10":a,"2":b}` 回来就成了 `{"2":b,"10":a}`。数字会保留你敲的那些位，所以二十位的 id 不会把最后三位丢给双精度，`1e999` 也不会变成 `null`。重复的键两个都留着，因为标准并没说哪个胜出，丢掉一个就是替你做决定。

### 它能格式化哪些语言？

JSON、XML、HTML、CSS 和 YAML。JSON、XML、HTML 和 CSS 还能压平；YAML 不行，因为它的短写法是流式风格，那是读不下去的，而读不下去恰恰是把文件留在 YAML 的理由的反面。JavaScript 是有意不在名单上的，见下面那条问题。

### 为什么它不格式化 JavaScript、Python 或 SQL？

因为要排开一门编程语言，就得把它真正解析明白，而一个差不多对的格式化器比没有还糟：它产出的代码看着没问题，做的却是另一回事。JSON、XML、CSS 和 YAML 的文法小到可以手读，也能用你自己跑得动的测试查清楚。JavaScript 的格式化器叫 Prettier，那是一兆字节的解析器，它该待在你的编辑器里，而不是一个网页上。

### 我的 YAML 写的是 no，转成 JSON 却成了字符串。为什么？

因为它本来就是字符串，而这里读的是 YAML 1.2，不是 1.1。在 YAML 1.1 里，`yes`、`no`、`on` 和 `off` 是布尔值，这就是那个把挪威的国家代码变成 `false` 的著名毛病。YAML 1.2 把它去掉了，这个工具也一样：只有 `true`、`false`、`null` 和 `~` 会被读成文本之外的东西。反过来写出去时，这些词会*加上引号*，尽管这里不加引号也照样读成文本——因为下一个打开这个文件的东西未必如此。PyYAML 至今默认还是 1.1。读得严、写得稳，是唯一在两个方向上都不出错的组合。

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

注释，因为 JSON 没地方放。锚点、别名和标签会被直接拒绝，而不是替你猜：它们每一个说的都是 JSON 说不出来的事，而一个悄悄挑了个解释的转换器，交给你的将是一份并非原文所说的文档。反方向不丢任何东西：每一份 JSON 文档本来就已经是一份 YAML 文档。

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

空对象、空数组和空字符串之间的区别，它们都会变成一个空元素；还有每个值的类型，因为 XML 没有类型——这也是为什么反向转换会把一切都留成字符串，而不是断定 `8080` 是个数字。数组会变成重复出现的元素，因为只有这种形状读得回来；而元素名承载不了的键，会把不便的字符替换掉，而不是吐出一份没有解析器读得动的文档。

### 重新缩进 HTML 会改变页面的样子吗？

可能会，这一点这里说得很老实。两个行内元素之间的空白，就是两个词之间的一个空格，挪动它并不免费。有两件事把这个风险摁住：`<pre>` 和 `<textarea>` 原样照抄，而一个只装着文本的元素会留在一行上。其余的才会被排开。

### 它能处理多大的文件？

这里没有设上限，因为没有哪台服务器在为上限掏钱。真正的天花板是你自己的机器：几兆字节的 JSON 没问题；文档特别长的时候，页面会等你敲字停一下再重新排版，而不是跟你抢键盘。

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

免费，没有账号，不用登录，没有试用期，贴多少也没有上限。本站带广告，经费就是从那儿来的，广告拿不到任何关于你文本的信息。

### 断网能用吗？

能。页面加载一次之后断开网络，它照样干活。这也是证明“什么都没上传”最省事的办法，真要把你的文本送出去格式化，拔线那一刻就停了。

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

- **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果，处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地，但已允许的主机仍可接收请求。策略不检查载荷，不能单独证明什么都没有发出。请把具体操作的请求与源码核对，或断网完成该本地操作。
- **这里不会去取任何东西。** 整个 `src/` 里没有 `fetch`，没有 `XMLHttpRequest`，也没有 `sendBeacon`。每个解析器和每个写出器，都是这个页面里接收一串字符、返回一串字符的函数。
- **格式化器会原样保留交给它的东西。** 一个 JSON 对象回来时，键还是你写的顺序，数字还是你写的那些位，因为 `src/shared/parse-json.js` 是一个解析器，而不是对 `JSON.parse` 的调用——后者会把像整数的键挪到前面，还会把二十位的 id 变成最接近的双精度。`tests/js/text-format.test.js` 里的测试查的正是这些。
- **Google 加载了什么，又拿不到什么。** 广告脚本和统计脚本来自 Google，捐助按钮来自 Buy Me a Coffee。你的文本，一个字符也没有交给它们。读取、解析、写出文本的每一行代码都由这个源提供，也都摆在仓库里。
- **断网也照样能用。** 断开网络，这个工具跟原来一模一样，因为它里面从来就没有联网这一步。这是最省事的一条证明。

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

最值得先读的几个文件：`config/site.toml` 里是 Content-Security-Policy，`src/shared/parse-json.js` 是那个会按你写的顺序保留键的解析器；至于为什么一次转换就是一个解析器加一个写出器、中间没有任何同时懂两种格式的东西，看 `src/convert.js`。
