JSON格式化工具

把压缩成一行的 JSON 粘进来,立刻按 2 空格缩进美化;语法出错会指出第几行第几列。默认示例是一段压缩 JSON,打开即可看到格式化结果。

默认已填示例;若清空后想恢复,点「载入示例」。解析在本地完成,不上传。
标准 JSON 用空格;Tab 仅用于本地查看。
排序后对象键按 a→z 排,便于比对差异。
超过 9007199254740991 的整数会丢精度。

提示:文本框是多行输入,按 Ctrl/Cmd + Enter 触发格式化;也可点「格式化」按钮,或切换缩进实时重排。

常见 JSON 错误与修正对照

错误写法问题修正写法
{a:1}键没加双引号{"a":1}
{'a':1}用了单引号{"a":1}
[1,2,]尾随逗号[1,2]
{"a":1}//注释JSON 不支持 // 注释删掉注释
{a:01}数字前导零{"a":1}
{a:NaN}NaN / undefined{"a":null}
{"a":}值缺失{"a":1}
{"a":1括号未闭合{"a":1}
{"a":'多行'}多行字符串用 \n 转义
{"a":1,}对象尾逗号{"a":1}
{a:1,b:2}多个键无引号{"a":1,"b":2}
Infinity顶层非值包成对象或数组
{"a":1}开头 BOM 头去掉 BOM 再解析
{"a":1} 结尾多余字符只留一个 JSON 值

错误表汇总常见非法写法与修正;实际解析报错时,结果区会给出你这段文本的具体行号与列号。

使用方法

  1. 在文本框粘贴或输入 JSON(默认已填一段压缩示例,含对象、数组、布尔与 null)。
  2. 选「缩进」:2 空格、4 空格或 Tab;选「键排序」可让对象键按字母升序排列,方便比对。
  3. 点「格式化」或按 Ctrl/Cmd + Enter,结果区立刻显示美化后的 JSON。
  4. 若语法有误,结果区(role="alert")会指出第几行第几列,对照下方的错误表定位修改。
  5. 点「复制结果」把美化后的 JSON 存到剪贴板;「导出错误表 CSV」把 14 行常见错误下载成带 BOM 的表格。

这个 JSON格式化工具能解决什么问题

一是把「一行乱麻」变成可读结构。接口返回的 JSON 常被压成一行,肉眼根本分不清层级。JSON格式化工具按缩进展开,对象、数组、嵌套一目了然,调试接口、看配置时不必再眯着眼数括号。

二是在粘贴进代码前先抓语法错。手写或拼接的 JSON 很容易漏引号、多加逗号、混入注释,直接喂给程序会报一头雾水的错。本工具先把文本解析一遍,出错时直接告诉你第几行第几列,比运行时报错快得多。

三是守住安全整数这条线。JavaScript 的 Number 只能精确表示到 2^53−1(9007199254740991),超过这个的大整数(如订单号、雪花 ID)会被悄悄丢精度。本工具检测到超界整数会提示你转成字符串,避免「看起来对了其实错了」。

本页 JSON格式化工具不做这些事:不联网校验、不调用远程接口、不把你的数据发出去;也不负责把 JSON 转成其他格式(那是另一类工具)。它只解析、美化、定位错误。

格式化原理:JSON.parse、缩进与键排序

核心是 JSON.parse,绝不用 eval。eval 会把字符串当代码执行,若文本里夹带 alert() 之类内容就会被执行,是严重安全隐患;JSON.parse 只按 JSON 文法解析,遇到非法结构直接抛错,不会执行任何代码。本页因此全程只用 JSON.parse。

美化靠 JSON.stringify 的第三个参数。解析出对象后,用 JSON.stringify(obj, null, 2) 重新序列化:第三个参数 2 表示每层缩进 2 空格,4 表示 4 空格,传 '\t' 则是 Tab。原文本是压缩还是已缩进,都不影响最终输出,因为先解析再生成。

键排序用 replacer 递归处理。选「按字母升序」时,本页对每个对象先取键数组、sort() 后再依次取值重组,递归到所有嵌套层级。这样两个内容相同但键顺序不同的对象,格式化后会得到逐行一致的结果,diff 更干净。

行号列号由出错位置反推。JSON.parse 抛出的错误常带「position N」字样,表示从头数第 N 个字符出错。本页用正则取出 N,再对文本做换行切分,数出该位置落在第几行、该行第几列,把「position 23」翻译成「第 3 行第 5 列」这种人话。

安全整数在解析前先扫描。本页遍历解析后的所有数字,若发现绝对值超过 Number.MAX_SAFE_INTEGER(2^53−1),就在结果区提示「该整数已超出安全范围,建议转字符串」,并高亮对应位置。这一检查独立于缩进,无论是否美化都会执行。

完整示例(默认输入实测)

默认输入:{"a":1,"b":[2,3],"c":{"d":true,"e":null}}。逐项核对(2 空格、保持顺序):

把 2 空格切成 4 空格,每层间距加倍但层级不变;勾选键排序后,a/b/c 仍按原序(字母本就升序),换成 {"c":1,"a":2} 则会变成 a 在上、c 在下。

输入范围与对照表

错误表是「通用规则」而非「你这段文本的诊断」;真出错时以结果区的行号列号为准,错误表用来对照理解。

边界与精度说明

常见问题

为什么不用 eval 直接解析?

eval 会把输入当 JavaScript 代码执行,如果文本里夹带函数调用或赋值,就会真的运行,存在代码注入风险。JSON.parse 只按 JSON 文法解析,非法结构直接抛错、绝不执行,所以本页全程只用 JSON.parse,这也是所有正规格式化工具有的底线。

报「第 3 行第 5 列」是怎么算出来的?

JSON.parse 报错时常带 position N(从头数的字符序号)。本页用正则取出 N,再对原文本按换行切分,累计每行长度找到 N 落在第几行,并在该行内数出列号,于是「position 23」被翻译成「第 3 行第 5 列」,比看字符序号直观得多。

超 2 的 53 次方的数字为什么会变?

JavaScript 的 Number 是双精度浮点,尾数只有 53 位,能精确表示的整数上限是 2^53−1 = 9007199254740991。超过它的整数(如雪花 ID、长订单号)会被舍入到最近的偶数,9007199254740993 变成 9007199254740992。所以这类数字务必用字符串存,本页遇到会提示转字符串。

为什么我的 JSON 有注释却报错?

因为标准 JSON 文法不允许注释(// 与 /* */ 都不行),也不允许单引号、尾随逗号。这些在 JS 对象字面量里合法,在 JSON 里非法。本工具严格按标准解析,遇到就报错并指出位置;若要保留注释,得先删掉再格式化。

键排序后和原来不一样,数据会变吗?

不会。排序只改变对象「键的排列顺序」,值与嵌套层级完全不变,序列化后内容等价。它的价值是让两份「键顺序不同但内容相同」的 JSON 格式化后逐行一致,diff 时不会被顺序差异干扰。

Tab 缩进和标准 JSON 冲突吗?

Tab 本身是合法空白字符,用 \t 缩进的 JSON 仍能被正常解析。但很多团队规范、版本控制系统更偏爱空格(尤其 2 空格)以保证跨编辑器一致。本页提供 Tab 仅为本地查看方便,对外交付建议切回 2 或 4 空格。

重复键会怎样?

同一对象里重复出现同名键(如 {"a":1,"a":2}),JSON.parse 会保留最后一次出现的值(这里是 2),本页不额外报错。若你的数据依赖「键唯一」,请先在源处确认没有重复,格式化工具有时为了兼容会默默取后者。

解析会把我粘贴的内容上传吗?

不会。所有解析、美化、扫描都在你当前浏览器里完成,页面不发起任何网络请求,也不写 Cookie 或 localStorage。你在开发者工具的 Network 面板里格式化几次,面板始终是空的。

相关工具