JSON 格式化工具
在浏览器中格式化、压缩并验证 JSON,会指出语法错误的行号与栏位,也可排序键名。你贴上的内容不会上传。
在你的浏览器中运行
格式化其实就是验证
要把 JSON 排版,就必须先解析它,所以任何能帮你排好版的工具,其实已经告诉你这份文件是否合法。 上面的工具每按一次键就重跑一次:只要右边持续产生结果,这份 JSON 就是合法的。
若不合法,讯息会指出解析器放弃的行号与栏位。那是错误被「发现」的位置,未必是错误发生的位置 ——第 12 行少了一个逗号,通常会回报在第 13 行的开头,因为那才是第一个接不下去的符号。
四种常见的「不是 JSON」
大多数「JSON 格式错误」其实是合法的 JavaScript,这正是混淆的来源。JSON 是严格的子集:
| 写法 | 为什么不合法 |
|---|---|
{name: "x"} | 键名必须是双引号字串 |
{'name': 'x'} | JSON 不接受单引号 |
{"a": 1,} | 结尾多余的逗号是语法错误 |
// 说明 | JSON 没有注解,任何位置都不行 |
NaN、Infinity、undefined 同样不存在,它们是 JavaScript 的值,在 JSON 里没有对应的表示法。
JSON 的数字是有限的十进位数,可以带指数。
大整数在来回转换中会失真
JSON.parse 产生的是 JavaScript 数字,也就是 IEEE-754 双精度浮点数。超过 2^53 − 1
(9007199254740991)的整数会无声地失去精度:
JSON.parse('{"id": 9007199254740993}').id // 9007199254740992
X(Twitter)的 snowflake ID、Discord ID,以及 64 比特的数据库主键都落在这个范围,这也是为什么 使用它们的 API 会把 id 序列化成字串。如果重新格式化之后 id 差了 1,原因就在这里,而且是解析器 造成的,不是格式化造成的。这类值请保持字串形式。
排序键名
在 JSON 规格里物件的键没有顺序意义,但实务上每个解析器都会保留原顺序。要比对两份数据相同、 顺序不同的文件,把两边都排序是最省事的做法。阵列则不会被动到:阵列的顺序本身就是数据。
你的数据只留在这里
解析与输出都在你的浏览器完成。你贴上的内容不会传送到任何地方——对 JSON 来说这件事比其他格式 更重要,因为 API 的内容经常夹带权杖、个资与内部识别码。