使用方法
- 把 JSON 文本粘进输入框,页面已预置一段含整数键、\u 转义与嵌套对象的示例,打开即可直接试。
- 选键顺序:保持解析序、键名升序(按代码点)或整数键优先(数值升序后接字符串键升序)。
- 选缩进符号:2 空格、4 空格或 Tab,Tab 在深层嵌套时体积最小。
- 点「美化打印」或按 Ctrl+Enter(Mac 为 Cmd+Enter),输出框给出展开结果,统计行报节点数、最大深度与字节数。
- 点「树形视图」看可折叠的结构树,点节点前的箭头收合子树;点「复制为 TSV」把扁平节点表粘进表格软件。
- 节点表默认展示前 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 空格 |
|---|---|---|---|---|
| 1 | 2 空格 | 20401 | 201 | 基准 |
| 2 | 4 空格 | 40401 | 201 | +98% |
| 3 | Tab | 10401 | 201 | -49% |
| 4 | 数字 2 | 20401 | 201 | 与 2 空格等价 |
| 5 | 数字 10(上限) | 100201 | 201 | +391% |
| 6 | 数字 11 起被夹到 10 | 100201 | 201 | 与上限等价 |
| 7 | 12 空格字符串 | 同 10 空格 | 201 | 字符串型截到 10 字符 |
| 8 | 数字 0 或空串 | 单行紧凑 | 1 | 等于不做美化 |
| 9 | 2 空格,5000 层嵌套 | stringify 抛 Maximum call stack size exceeded | ||
| 10 | 2 空格,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、树渲染全部走浏览器原生引擎,无网络请求;示例文本预置在页面里,脚本被禁用时输入框依然有完整示例可复制。
相关工具
- JSON校验工具:只关心语法对错时用专业校验页。
- JSON差异工具:两份 JSON 的结构差异对比。
- JSON转义反转义工具:处理被二次转义的 JSON 字符串。
- CSV转JSON转换器:表格数据进 JSON 的入口。
- JSON转CSV转换器:对象数组整表导出的另一条路。
- YAML转JSON转换器:配置文件口径互转。
- XML转JSON转换器:老接口数据的结构迁移。
更多开发工具见开发者工具分类页。