1 选好要做的事
语言 判断只是个起点,改正只要一次点击。
给每个对象的键排序 按键读起来的顺序,而不是按码位,所以 item2 排在 item10 前面。仅限 JSON。
最外层元素的名字 XML 顶上只有一个元素,JSON 没有,所以得替它造一个。
2 贴进来
3 把结果带走
# 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`。
怎样在不上传的前提下格式化或转换 JSON
- 选好要做的事。两个标签页,一个输入框:“格式化”把 JSON、XML、HTML、CSS 和 YAML 排好或压扁;“转换”把 JSON 变成 YAML 或 XML,再变回来。你刚格式化完的文本就是你要转换的文本,不用贴第二遍。
- 贴进来,或者把文件拖进来。凡是你能选中并复制的都行。拖到选择框上的文件由你自己的浏览器读进输入框:这里根本没有可省略的上传步骤。
- 让它自己判断语言,或者直接告诉它。菜单里写着它把这段文本当成了什么,改正只要一次点击。判断只是个起点,所以它被摆出来,而不是悄悄套用。
- 选好缩进,或者干脆压平。两个空格、四个空格,或者一个制表符。压平就是同一份文档,只是把纯粹为了阅读才存在的空白都去掉,结果里会写明这样省下了多少字节。
- 在出错的地方读错误。这里的解析器失败时,会说它看到了什么,以及在第几行第几列,而不是“位置 4193 处有意外的 token”。通常这就足够把一份配置文件改对,不用再打开别的东西。
- 把结果带走。复制它,或者下载成文件,文件名跟着输出语言走。
说得更细的版本
怎么不把 JSON 交给任何人也能格式化 在自己的浏览器里排版、检查和压缩 JSON:一个格式化工具绝不该改动你文件的哪些地方、错误信息该怎么读,以及你把东西粘进哪个框里为什么要紧。
工具箱里还有
常见问题
我的文本会被传到哪里去吗?
不会。这个页面上的每个解析器和写出器,都是在你自己的浏览器里、你自己的硬件上运行的函数。这个工具没有任何形式的网络功能:它从不去取什么,也从不发出什么;页面的 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 没问题;文档特别长的时候,页面会等你敲字停一下再重新排版,而不是跟你抢键盘。
它免费吗,需要注册吗?
免费,没有账号,不用登录,没有试用期,贴多少也没有上限。本站带广告,经费就是从那儿来的,广告拿不到任何关于你文本的信息。
断网能用吗?
能。页面加载一次之后断开网络,它照样干活。这也是证明“什么都没上传”最省事的办法,真要把你的文本送出去格式化,拔线那一刻就停了。