跳到主要内容
Leavesc

JSON 格式化与校验

格式化、压缩、校验 JSON,不用把内容粘到服务器上。

  • 100% 纯前端
  • 永久免费
  • 无需注册
输出

完全在你的浏览器里运行,文件不会上传到任何服务器。

你正盯着的那段 JSON,通常是意图正确、细节有错:手工拼的配置少了一个逗号,从终端日志里复制的负载被截断了,从文档里粘来的片段带着弯引号,而错误是在三层之外才以一个没有上下文的位置信息冒出来。格式化是看见这些问题最快的办法——缩进之后,出错的字符就落在你能读的一行上。除了排错,格式化还决定了负载能不能被人评审:两份压缩成一行的 40 KB 接口返回,没法做 diff;两份排好版的返回,任何人都能看出到底哪个字段变了。还有第二个理由让你在浏览器标签页里做这件事,而不是在某个网站上做,那也是这个工具不上传任何东西的原因:接口返回体里经常带着 access token、会话标识、个人记录和内网主机名,把这些粘进一个会转发给别人的服务器表单,等于主动制造一次数据泄露。这里解析和重新输出,都发生在你已经打开的这个标签页里。

规范到底允许什么

JSON 由 RFC 8259 定义,真正咬人的规则都在语法里。对象的键和字符串值必须用双引号,单引号会让整个文档非法。不允许注释、不允许尾逗号、也不允许不带引号的标识符——从控制台里复制的 JavaScript 对象解析失败,多半就是最后这条。取值类型只有六种:对象、数组、字符串、数字、true、false 和 null,没有 undefined,没有 NaN,没有 Infinity,也没有日期字面量。数字同样严格:不能有前导加号、不能有前导零、不能用十六进制、不能以小数点结尾。字符串里的控制字符必须转义,反斜杠自己也要转义,所以 Windows 路径 C:\Users\me 会直接让文档解析失败,除非每个反斜杠都写成两个。对象里出现重复键在语法上被容忍,但规范说键名应当唯一,重复时行为不可预期——多数解析器会静默保留最后一个,也就是说重复键是一种数据丢失的 bug,而且永远不会有任何报错告诉你。

格式化改变了什么,又掩盖了什么

缩进属于空白,而空白不是数据,所以重新排版本身不会改变含义。微妙之处在于,为了排出这个缩进,工具必须先把文本解析成语言值再打印出来,而这一来一回并不是恒等变换:重复键会塌成一个,数字格式会被归一化,1.0 打成 1,1e2 打成 100,超过安全整数范围的部分会掉精度;转义序列会被重写,unicode 转义可能变回字面字符,值相同但字节不同。如果某种传输格式或签名依赖确切的字节,排好版的副本就不能直接替换。而人们最希望被保留的两样东西——注释和尾逗号——本来就不是合法 JSON,如果一个格式化工具接受它们,那它描述的是另一种格式,JSONC 和 JSON5 才是干这个的。

精度与键序:来回转换掩盖的两个坑

JavaScript 的数字是双精度浮点,大约到 900 万亿以内的整数是精确的,再往后就四舍五入,而 JSON.parse 不会给你任何警告:一个 12345678901234567890 的订单号会被读成 12345678901234567000,然后再发出去,错误已经写进数据库了。纳秒时间戳、雪花 ID、以最小货币单位存储的金额,是最常见的受害者。解决办法要么是把这类值在文档里就写成字符串,要么是用保留大整数(BigInt 或十进制对象)的无损解析库。第二个坑是键序:JavaScript 对象会先按升序列出形似整数的键,再按插入顺序列出字符串键,于是写成 10、9、2 的对象读回来会变成 2、9、10。这也是这里的键名排序是可选而不是默认的原因:它能让输出稳定、方便做 diff,但也会毁掉任何依赖人工顺序的场景,包括某些工具从上往下读取的优先字段。

排序、压缩,以及真正可用的 diff 流程

有两个转换在日常工作里非常值:按字母排序键名,能把来自不同来源的两份返回变成可比较的形状,把一面墙的文字变成一份能读的 diff——把两个版本分别贴进 diff 工具,改动的那一个字段一眼就看见了。压缩则去掉空白,在负载要塞进 URL、当作缓存键,或者从上行带宽吃紧的设备发出去时很重要。值得养成的习惯是:先拿原始内容和格式化后的输出做一次 diff,再决定信哪一个。如果只有空白不同,说明原文本来就是规范的;如果别的也变了,那你刚刚发现了一个数字精度问题或一个重复键,现在知道比上线后发现要好。

常见问题

我的 JSON 会被上传到服务器吗?

不会。文本在你的浏览器标签页里被解析和重新输出,不会被传输,本页没有上传接口。本站靠广告维持,广告服务商会看到页面层面的信息,比如你的 IP 地址和访问了哪些页面,但看不到编辑器里的内容。

我的 JSON 看起来没问题,为什么解析失败?

常见的四种:闭合括号前多了尾逗号、从 JavaScript 里复制的单引号或没加引号的键、从文字处理软件或聊天工具粘来的弯引号,以及 Windows 路径里没转义的反斜杠。第五种也值得记住:日志被截断后留下的省略号。报错给出的行列通常指向真正错误之后的那个字符,所以往上看一行。

格式化会改变我的数据吗?

缩进本身不会,因为空白不是数据。但要排出这个缩进就得解析再打印,而这一来一回会归一化数字、可能合并重复键、重写转义序列。如果确切的字节很重要,比如有东西要对文档签名或计算哈希,请保留原件,把排好版的副本只当调试产物。

能处理多大的文件?

取决于设备而不是工具。浏览器的 JSON 解析是同步的,特别大的文档会让标签页卡住,桌面端几 MB 的返回通常没问题,手机上会比较难受。如果你要格式化的是 GB 级导出文件,请改用支持流式处理的命令行工具。

相关工具