跳到正文
简体中文
工作台什么都不上传的工具
ODERSA 协会的一间工坊什么都不外传,什么都不留存,什么都到不了我们手里。

工坊 · 格式化 JSON

怎么用 : 格式化 JSON

这里的解析器是自己手写的,没有借用浏览器的:因为浏览器的报错文字没有任何规范约束,各家浏览器还各说各话。这一个会告诉您第几行、第几列,以及那里本该是什么,在哪儿都一样。

打开工具

一个被程序拒收的 JSON 文件,加上一句什么也没说清的报错:这是每天跟配置文件或者数据导出打交道的人的日常。所以一个校验器的头等任务,就是精确地说出在哪里,以及那个位置本该是什么。

正因如此,这里的解析器是自己写的,而不是借浏览器的。脚本语言的标准规定了浏览器必须抛出的异常类型,却没规定它的文字:Firefox 给行和列,Chrome 给一个按字节数的位置,Safari 两样都不给。所以一件照抄这条消息的工具,会因为用户的浏览器不同而给出不同的诊断。我们这一个自己数行、自己数列。

而且它看得见三样浏览器那个函数会闷声吞掉的东西。重复的键:标准说键“应该”唯一,还说收到重复键的软件行为不可预知;实际上后一个会覆盖前一个,于是一条数据一声不响地消失了。落单的 Unicode 半个代理字符,它什么也编码不了,却会让下游一半的读取器崩掉。还有文件开头的字节序标记,标准明令不许添加它。

怎么用

  1. 把您的 JSON 粘进来。它不会离开您的设备,这对一份数据导出、或者一份带着凭证的配置文件很要紧。
  2. 选好缩进方式;如果接下来要比对两个文件,就把键排序也打开。
  3. 如果 JSON 不合法,看行号、列号和那里期待的符号。如果它合法,看那张提醒表:重复的键就藏在那儿。

支持的格式

严格按标准定义的 JSON:不能有注释,闭合括号前不能有多余的逗号,键不能不加引号。这三种写法很常见,工具会点名拒绝,因为程序也一样会拒绝。

JSON 格式的文字

最多 400000 个符号。结果可以下载成 .json,也可以一键复制。

查看兼容性对照表

它的限制

工具照标准来,不迁就某些程序的宽容

注释、多余的逗号和不加引号的键,好几款开发工具都收,但它们不是 JSON:标准里没有这些东西,而拒收您文件的那个程序是对的。我们也不收,因为一个宽容的校验器会让您以为自己的文件到别处也过得去。

重复的键只会被指出来,绝不替您改掉

标准写着,一个对象里的名字应该唯一,如果不唯一,接收这些数据的软件行为就不可预知。实际上,几乎所有实现都保留最后一个值:于是一条数据一声不响地消失了。工具会把它们连同路径和行号点出来,但格式化后的文件跟大家做法一致,保留最后一个值,因为反过来做才叫意外。

特别大的数字可能丢位,这不是我们造成的

浏览器的脚本语言只能精确表示到大约九百亿亿的整数。写在 JSON 里的、比这还大的编号,一读进来就会丢位,任何经过这门语言的工具都一样。正因如此,正经的接口会把大编号当成带引号的字符串来传输;如果您在文件里看到一个光着的大数,那问题在轮到我们之前就已经存在了。

键的顺序会保留,除了那些看起来像数字的键

JavaScript 的对象总是把写起来像整数的键排在最前面、按从小到大排列,不管它们原来在什么位置。这是这门语言的规则,不是我们的选择,任何经过这门语言的工具都躲不掉。所以一个键为“10”“2”“1”的对象,原来的顺序就丢了。把这件事说出来,好过瞒着。

关于这个工具的问题

我的数据会被发到什么地方吗?

不会,而且这一点在这里比别处更要紧:一份 JSON 格式的配置文件里常常带着凭证、内网地址,有时还有访问密钥。三十秒就能验证:按 F12 打开开发者工具,切到“网络”标签页,清空列表,然后把 JSON 粘进来检查一遍。一行都不会冒出来。把网断掉再做一遍。

为什么我带注释的 JSON 被拒了?

因为那不是 JSON。标准里没有任何注释,它的作者也解释过是自己有意去掉的。好几款开发工具为了方便还是收,这就把水搅浑了:您的文件在自己机器上过得去,到线上就挂。我们拒收的理由跟一个校验器该拒收的理由一样:告诉您您的文件到底是什么。

给键排序有什么用?

用来比对。同样的数据被两个不同的程序导出来,键的顺序常常不一样:直接比就会冒出几百处假差异。把两份都排一遍序,再粘到同一个专区的“比对两段文字”里:剩下的就只有真正的差异了。这是这个页面上最有用的一个手法。

你们说的重复的键,真的是允许的吗?

标准写的是,一个对象里的名字“应该”唯一,如果不唯一,接收数据的软件行为就变得不可预知。所以它既不算被禁止,也不安全。实际上,几乎所有实现都保留最后一个值,一声不响地把前一个扔掉:如果同一个对象里有两个“价格”键,其中一个价格早就不存在了。这正是那种能让人找上两个钟头的问题,所以我们要把它指出来。

我那个十九位的编号,格式化之后变了。

是的,而这不是我们造成的:这是所有浏览器所用那门语言的限制,它只能精确表示到大约九百亿亿的整数。再往上,一读进来末尾几位就变了,任何经过这门语言的工具都一样。正因如此,正经的接口会把大编号加上引号、当字符串来传。如果您那个在文件里是光着的,那问题在轮到您之前就已经存在了。