MiServe DevTools

我的贴纸

把工具固定在这里,会保存在此浏览器中。

JSON 格式化与校验

格式化、压缩和校验 JSON,精确给出语法错误所在的行和列,大数字按原样保留。

在浏览器中运行。粘贴的内容不会被上传。

关于此工具

什么是有效的 JSON

JSON 由 RFC 8259 和 ECMA-404 定义。一个文档就是一个值:对象、数组、字符串、数字、true、false 或 null。字符串和对象的键都用双引号括起来,并且没有注释语法。

很多出错的文档里都有 JavaScript 对象字面量允许、而 JSON 不允许的写法:最后一项后面的逗号、单引号、没有引号的键,或者注释。打开修复常见错误后,此工具能读取这些写法,以及字符串中的原始换行符和制表符、单引号前的反斜杠、Python 的 True、False 和 None,告诉你改了哪些地方,并输出严格的 JSON。

看懂错误信息

各个浏览器对 JSON.parse 错误的表述各不相同,有些还不指出错误的位置。此工具用自己的解析器读取文本,所以在任何浏览器中,错误信息、行号和列号都是一样的。跳到错误处会在输入中选中出错的字符;粘贴整个文档时,工具会自动这样做。

报告的位置是解析器无法继续的地方,可能比真正出错的地方稍晚一些。例如缺少逗号时,报告的是下一项的第一个字符。

大数字与重复的键

JSON 语法对数字的大小没有限制,但 JavaScript 中的 JSON.parse 会把每个数字都转成 64 位浮点数,而它只能精确表示不超过 2 的 53 次方(9,007,199,254,740,992)的整数。像 12345678901234567890 这样更大的标识符,经过 JSON.parse 后会变成 12345678901234567000。此格式化工具照抄每个数字的文本,而不做转换,因此长整数、1.0 和 1e5 输出时与输入完全一致;如果某个整数经过 JavaScript 解析器后无法保持原值,工具会发出警告。

RFC 8259 规定对象的键应当唯一,并指出软件收到重复键时的行为不可预测。很多解析器会不加提示地只保留最后一个值。此格式化工具会保留每一个条目,并告诉你第一个重复键的位置。

按键名排序会对每一层、每个对象的键排序,排序依据是 UTF-16 码元,也就是 JavaScript 默认排序的顺序:先数字,再大写字母,最后小写字母。数组保持原有顺序。大小按 UTF-8 字节数计算。

常见问题

我粘贴的 JSON 会被发送到服务器吗?

不会。文本由浏览器标签页中的 JavaScript 解析和格式化,此工具不会用你粘贴的内容发出任何网络请求。

为什么注释和末尾逗号会报错?

RFC 8259 的语法中没有注释,并且要求每个逗号后面都有一个值,因此标准解析器会拒绝这两种写法。允许它们的 JSON5 是另一种格式。打开修复选项,就能读取这类文件并得到严格的 JSON。

格式化和压缩有什么区别?

格式化会把每一项放在单独的一行并加上缩进,让结构更易读。压缩会删除各项之间的空白,让文档在存储和传输时更小。两种形式中的数据完全相同。

按键名排序会改变数据吗?

对于遵循规范的程序来说不会,因为规范把对象描述为名称/值对的无序集合。排序便于逐行比较两个文档。数组是有序的,所以其中的项永远不会被移动。

数据分类的其他工具