JSON格式化与校验工具
粘贴JSON即可美化排版、压缩或按键排序。如果无法解析,工具会显示解析器出错的行号和列号,并在问题位置下方标出指示符,即使是3,000行的响应里漏掉一个逗号,也只需几秒就能找到。
0 个字符 · 0 个词 · 0 行
0 个字符 · 0 个词 · 0 行
完全在当前浏览器标签页中运行,您的文本不会被上传或保存。
JSON 值类型
RFC 8259 仅允许以下这些值。对象和数组可以嵌套,其余均为叶子值。
| 类型 | 示例 | 规则 |
|---|---|---|
| 对象 | {"id": 7, "tags": ["a"]} | 键必须是双引号字符串;成员之间用逗号分隔,末尾不能有多余的逗号。 |
| 数组 | [1, "two", null] | 任意值的有序列表,允许混合类型。 |
| 字符串 | "caf\u00e9 \"quoted\"" | 只能使用双引号;控制字符必须转义;\u 转义使用四位十六进制数字。 |
| 数字 | -12.5e3 | 仅限十进制:可有负号,不允许前导零,可有小数和指数。不支持 NaN 或 Infinity。 |
| true、false、null | true | 小写,不加引号。 |
解析器会拒绝的内容
下面每个输入都已在构建本页时传给格式化工具所用的同一个 JSON.parse。
| 输入 | 问题 | JSON.parse |
|---|---|---|
{"a": 1,} | 末尾多余的逗号 | 拒绝 |
{'a': 1} | 单引号字符串 | 拒绝 |
{"a": 1 /* note */} | 注释 | 拒绝 |
{a: 1} | 未加引号的键 | 拒绝 |
{"n": NaN} | NaN 不是 JSON 数字 | 拒绝 |
{"n": 012} | 前导零 | 拒绝 |
{"n": 0x1F} | 十六进制数字 | 拒绝 |
JSON 字符串中的转义
| 字符 | 在 JSON 中的写法 |
|---|---|
| 双引号 | "\"" |
| 反斜杠 | "\\" |
| 换行符 | "\n" |
| 制表符 | "\t" |
| 回车符 | "\r" |
| 控制字符 U+0001 | "\u0001" |
| 正斜杠(转义可选) | "/" |
| 非 ASCII 字母(无需转义) | "é" |
合法JSON文档需要遵守的规则
JSON 由 RFC 8259 规定(与 ECMA-404 实质相同)。一个 JSON 文档就是一个单独的值:对象、数组、字符串、数字、true、false 或 null。对象的键始终是用双引号括起来的字符串。字符串只能使用双引号,并且必须转义双引号、反斜杠以及 U+0020 以下的所有控制字符,因此字符串中的制表符和换行要写成 \t 和 \n。RFC 8259 还要求在系统之间交换的 JSON 使用 UTF-8 编码。
数字使用十进制:不能有前导零,不能用十六进制,不能出现 NaN 或 Infinity,前面也不能加加号。JSON 没有注释,也不允许尾随逗号。这最后两条规则造成了实际中的大多数错误,因为 JavaScript 对象字面量、JSON5 和许多配置文件都允许这两种写法。下方的参考表是把每种常见错误输入格式化工具所用的同一个解析器后得出的。
美化、压缩、排序
美化输出会添加换行和缩进,让结构一目了然;两个空格是 JavaScript 项目中最常见的风格,四个空格是 Python 的 json.dumps(indent=4) 常用的选择,而制表符则让每位读者自行决定显示宽度。压缩会删除所有不影响含义的空白,既能减小 API 传输的数据量,也能让文档在日志或环境变量中保持单行。
键排序会递归地按字母顺序排列每个对象的成员。JSON 对象按定义是无序的,所以排序不会改变含义,但能让来自不同系统的两份文档更容易对比。请注意,解析时数字会变成 JavaScript 的双精度浮点数:超过 2^53(9,007,199,254,740,992)的整数,例如某些数据库 ID,在重新格式化后会丢失精度,因此这类值请保存为字符串。
将JSON转换为其他格式
格式化后的文档更易阅读,但有时你需要把它变成另一种形式。通过 JSON 转 CSV,对象数组可以变成电子表格;数据格式转换则可以在 JSON、XML、YAML 和 CSV 之间转换整个文件。
常见问题
- 为什么带注释的JSON会被格式化工具拒绝?
- 标准 JSON 没有注释语法,RFC 8259 是有意不包含的。请删除注释;如果读取该文件的工具支持 JSONC 或 JSON5,也可以把文件保留为这两种格式。
- JSON报错中的“Unexpected token”是什么意思?
- 解析器遇到了不能出现在该位置的字符,例如单引号、} 之前的尾随逗号或没有加引号的键。显示的行号和列号就指向这个字符。
- 按键排序会改变我的数据吗?
- 不会。JSON 中对象成员的顺序没有意义,所以排序后的文档与原文档等价。数组的顺序是有意义的,永远不会被改动。
- 为什么格式化后长数字变了?
- JavaScript 用 64 位浮点数存储数字,只有在 2^53 以内才能精确表示整数。更大的 ID 在解析时会被四舍五入;请以字符串形式传输,以保留每一位数字。
- 可以直接格式化JSON文件而不用粘贴吗?
- 用任意文本编辑器打开文件,全选后粘贴到这里即可。几十 MB 的超大文件在文本框渲染时可能会让标签页变慢。