JSON美化打印

键顺序重排、缩进符号可选、树形折叠视图与复制成表格,一次看清数据结构。

键顺序: 缩进:
默认示例已就绪:162 字符输入,展开为 2 空格缩进 201 字符 17 行,共 14 个节点、最大深度 3。

使用方法

  1. 把 JSON 文本粘进输入框,页面已预置一段含整数键、\u 转义与嵌套对象的示例,打开即可直接试。
  2. 选键顺序:保持解析序、键名升序(按代码点)或整数键优先(数值升序后接字符串键升序)。
  3. 选缩进符号:2 空格、4 空格或 Tab,Tab 在深层嵌套时体积最小。
  4. 点「美化打印」或按 Ctrl+Enter(Mac 为 Cmd+Enter),输出框给出展开结果,统计行报节点数、最大深度与字节数。
  5. 点「树形视图」看可折叠的结构树,点节点前的箭头收合子树;点「复制为 TSV」把扁平节点表粘进表格软件。
  6. 节点表默认展示前 12 行,点「加载更多」续看,「导出 CSV」下载带 BOM 的 UTF-8 文件。

这个JSON美化打印工具能解决什么问题

第一,看清键的顺序问题。接口返回的 JSON 里 "10" 排在 "2" 前面时,多数人以为是 bug——其实 JSON.parse 后整数样键会按 ECMA-262 OrdinaryOwnPropertyKeys 提前并按数值升序,源文本顺序根本不保留。JSON美化打印把这一行为显式摆出来,并提供两种确定性的重排口径。

第二,按用途挑缩进。同样一份 100 层嵌套的结构,2 空格缩进展开后 20401 字符,Tab 缩进只要 10401 字符,差近一倍;日志文件用 Tab,代码评审用 2 空格,是常见的搭配。

第三,把嵌套结构变成表格。树形视图解决「看」,TSV/CSV 解决「算」:把每个叶子节点的路径、类型、值铺平成行,粘进 Excel 就能做字段覆盖率核对。

本页不做的事:不校验 Schema(那是 JSON 校验工具的职责)、不压缩(单行输出请用压缩工具)、也不处理 JSON5/JSONC 这类允许注释与非引号键的超集语法。

原理和变量

JSON美化打印的核心调用只有一个:JSON.stringify(JSON.parse(输入), replacer, 缩进)。第二参数必须传 null——传数组会只保留指定字段、传函数会改写每个值,两者都会真的改动数据;第三参数决定缩进:数字型会被夹取到 0~10,字符串型原样使用但最多取前 10 个字符,所以传 12 个空格与传 10 个空格结果一样,本页的三个档位(2 空格、4 空格、Tab)都落在规范行为内。

键排序在 stringify 之前递归完成。三种口径的实测差异(示例键集 b、10、2、a、C、一):保持解析序得 2,10,b,a,C,一(整数键被引擎提前);键名升序按代码点比较得 10,2,C,a,b,一——大写 C 是 0x43,小于小写 a 的 0x61,更小于汉字「一」的 0x4E00,所以它不是拼音序也不是本地化序;整数键优先得 2,10,C,a,b,一,整数键先按数值排、其余键再按代码点排。

解析遵循 ECMA-404 语法与 RFC 8259 交换格式。JSON.parse 同时完成一层归一化:1.50 变 1.5、1e3 变 1000、-0 变 0、\u4e2d\u6587 变「中文」、重复键后者胜。这些是不可逆点——美化输出与输入文本字节级不同,但语义相同。

树形视图按「对象/数组展开、标量为叶」递归建 DOM,收合只是把子容器 display 切成 none,不重建节点,所以折叠是零成本操作。TSV 扁平化按深度优先遍历:路径用点号拼接、数组下标用方括号;若顶层是「对象数组」则改走列并集口径,把每条记录铺成一行。

完整示例(数值仅作演示)

JSON美化打印预置的示例 162 字符:{"id":7,"name":"\u4e2d\u6587\u540d","active":true,"score":1.50,"tags":["a","b"],"profile":{"city":"\u5317\u4eac","zip":"100000"},"note":null,"10":"ten","2":"two"}。解析后 14 个节点、最大深度 3。按保持解析序输出 2 空格缩进是 201 字符 17 行——整数键 "2" 与 "10" 跳到了最前面,score 显示为 1.5(尾零被归一化剥掉),name 显示为中文。切到 4 空格缩进是 239 字符,Tab 缩进是 182 字符。根节点下 9 个顶层键在节点表里对应 9 行起,全部叶子铺平后用「加载更多」翻完。

输入范围与对照表

输入超过 200 KB 时统计行会提示展开后的体积增长,超过 2 MB(2097152 字节)直接拒绝——几 MB 文本一次 stringify 展开加渲染会卡死标签页。缩进符号对体积的影响见下表(同一份 100 层嵌套数组,实测值):

#缩进展开后字符数行数相对 2 空格
12 空格20401201基准
24 空格40401201+98%
3Tab10401201-49%
4数字 220401201与 2 空格等价
5数字 10(上限)100201201+391%
6数字 11 起被夹到 10100201201与上限等价
712 空格字符串同 10 空格201字符串型截到 10 字符
8数字 0 或空串单行紧凑1等于不做美化
92 空格,5000 层嵌套stringify 抛 Maximum call stack size exceeded
102 空格,1000 层嵌套正常完成—parse 与 stringify 均通过
11顶层标量 123 / "abc" / null合法 JSON,无键可排序,按原样输出
12重复键 {"a":1,"a":2}后者胜,输出 {"a":2}

边界与精度

数值精度有一条硬边界:安全整数上限是 2^53-1 即 9007199254740991,JSON.parse("9007199254740993") 会静默变成 9007199254740992,末尾的 3 消失。这不是本页能修的——文本里的长 ID(雪花 ID、订单号)必须以字符串形式承载,双引号一包就安全。同理 0.1+0.2 在输出里写作 0.30000000000000004,是 IEEE 754 双精度的正常结果而非 bug。

深度的边界在 stringify 而不在 parse:V8 的 JSON.parse 是迭代实现,5000 层嵌套解析不报错,但对它做 stringify 会抛 Maximum call stack size exceeded(实测断点在 1000~5000 层之间)。本页对解析后的值做树形渲染时同样受递归深度约束,异常会被捕获并提示改用纯文本输出。

错误定位的口径:JSON.parse 的报错文本里带 at position N(如尾逗号 {"a":1,} 报 position 7),本页把 N 换算成第几行第几列再连同原始报错一起显示,例如「第 1 行第 8 列附近:JSON 不允许尾逗号,删掉 1 后面的逗号」。找不到 position 的报错(如 +1 开头)则原样附上英文消息,绝不吞掉。

顶层是标量或 null 时(123、"abc"、true、null 都是合法 JSON),键排序没有意义,本页照常输出并提示「顶层不是对象,无法排序键」,而不是静默忽略排序选项;判空必须写 v === null,因为 typeof null 恰好也返回 "object"。

常见问题

为什么 "10" 跑到 "2" 前面去了?

JSON.parse 后整数样键由 ECMA-262 的 OrdinaryOwnPropertyKeys 决定枚举序:先整数索引按数值升序,再字符串键按插入序。源文本顺序不保留。想按字典序看全键,选「键名升序」;想保留整数键数值序,选「整数键优先」。

键名升序为什么大写排在小写前面?

本页按代码点比较:C 是 0x43,a 是 0x61,所以 C 在前。这不是拼音序也不是 locale 感知排序,好处是完全确定、跨环境一致,适合做 diff 前的归一化。

美化后的 JSON 和原来字节一样吗?

不一样也不必一样。1.50 与 1.5、\u4e2d\u6587 与「中文」语义相同,parse 一层归一化后就回不去了。美化只保证语义等价,输出重新解析后与原数据深比较一致。

报错里的 position 怎么换算行列?

把报错文本里 at position N 的 N 当作从 0 起的字符下标,数到 N 之前有几个换行符即第几行,N 减去上一个换行符的位置即第几列。本页自动完成换算并显示原报错,方便与标准报错对照。

展开后文件太大,编辑器卡了?

缩进符号换 Tab(同结构下比 4 空格省约一半体积);单行紧凑输出不是本页功能,请用 JSON 压缩工具。超过 2 MB 本页直接拒绝,避免卡死标签页。

TSV 和 CSV 两个导出有什么区别?

复制为 TSV 用制表符分隔、直接进剪贴板,适合临时粘进表格软件;导出 CSV 用逗号分隔并带 BOM 文件头(EF BB BF),Excel 双击不乱码。两者都不含 U+FEFF 之外的转义,JSON 本体导出(复制结果)永远不带 BOM,否则 JSON.parse 会报错。

树形视图里点折叠会不会重算?

不会。折叠只是切换子容器的显隐,节点早已建好;反复折叠展开的开销接近零。这也是树只建一次、不随缩进选项实时重建的原因。

处理在我的浏览器里完成吗?

是。JSON美化打印的 parse、stringify、树渲染全部走浏览器原生引擎,无网络请求;示例文本预置在页面里,脚本被禁用时输入框依然有完整示例可复制。

相关工具

更多开发工具见开发者工具分类页。