免费工具 JSON 格式化 · JSON 在线解析与校验
把接口返回、后端日志里的一行 JSON、埋点上报的数据贴进来:按严格 JSON 校验,按你选的缩进排好版;格式不对时,直接告诉你解析停在第几行第几列。
- 严格 JSON 校验
- 边输边格式化
- 本地处理
格式化、压缩或校验 JSON
示例是一条统计 SDK 上报的「支付成功」事件。换成你自己的 JSON,结果和统计数字会随输入更新。
只接受严格 JSON:双引号,不能有注释和末尾逗号。
键数
14
所有层级的对象键之和,数组元素不算键。
嵌套层级
4
对象和数组套了几层;单个值是 0。
大小(字节)
331
下方格式化结果的 UTF-8 字节数。
{
"event": "order_paid",
"time": 1794297600,
"user": {
"id": "u_1024",
"plan": "年度会员"
},
"properties": {
"order_id": "A8841",
"amount": 199,
"currency": "CNY",
"coupon": null,
"items": [
{
"sku": "PRO-12",
"name": "专业版",
"qty": 1
}
]
}
}版本 v1.0更新于 更新记录
格式化之外,它还告诉你什么
除了排好版的文本,还有一个校验结论和三个数字,各回答一个问题。
格式正确,或第几行第几列
「格式正确」表示严格的 JSON 解析器能原样接受。出错时给出的位置是解析器放弃的地方:漏了逗号,通常会报在下一个键的开头,所以要看这个位置和它前一个字符。
键数
所有对象里的键加起来,嵌套的也算。示例共 14 个:顶层 4 个,user 下 2 个,properties 下 5 个,商品里 3 个。数组元素是值不是键,100 个数字的数组不增加键数。
嵌套层级
最深的一条路径上套了几层对象和数组。示例是 4 层:最外层对象 → properties → items → 里面的商品对象。层级越深越难查询,很多统计工具会把事件属性压平到一两层。
大小(字节)
格式化结果的 UTF-8 字节数,所以会随缩进变化。一个汉字占 3 个字节,示例里的「年度会员」「专业版」就占了 21 字节。核对请求体、日志长度上限时,看压缩后的大小。
格式化是把解析出来的数据重新输出,等价的写法会换成标准形式:1.50 变成 1.5,1e3 变成 1000,\u4e2d 变成「中」。数据没变,只是文本不再逐字节相同。
三步用完
不用安装,也不用点「格式化」按钮。
-
1
粘贴 JSON
从浏览器开发者工具的 Network、日志、Postman / Apifox 或文件里复制过来;首尾多出的空白不影响。
-
2
选排版方式
阅读一般用 2 个空格;4 个空格或 Tab 跟项目代码风格走;写进请求体、环境变量或配置项时选「压缩成一行」。要对比两段数据时勾上「按键名排序」。
-
3
改错或复制
有错就按提示的行列去改;显示「格式正确」后,用代码块上的复制按钮拿走结果。
严格 JSON 允许什么
JSON(RFC 8259)是 JavaScript 对象写法的一个小子集。大部分「JSON 格式错误」,都是把 JS、Python 或 YAML 的写法带进了 JSON。
- 值只有六种:字符串、数字、对象、数组、
true/false、null - 没有日期类型:用 ISO 8601 字符串或 Unix 时间戳表示
- 符号之间的空白随意加减,所以格式化不会改变数据
| 规则 | 可以 | 不可以 |
|---|---|---|
| 键名必须用双引号 | {"plan": "pro"} | {plan: "pro"} |
| 字符串用英文双引号 | "pro" | 'pro'、“pro” |
| 最后一项后面不能有逗号 | [1, 2] | [1, 2,] |
| 不能写注释 | — | // 备注、/* 备注 */ |
| 数字只能是十进制 | 199、-0.5、1.5e3 | 0199、0x1F、+1、NaN |
| 只认 JSON 的字面量 | true、null | True、None、undefined |
| 字符串里的控制字符要转义 | "第一行\n第二行" | 引号里直接换行 |
同一条事件,四种排版
示例里的支付事件(14 个键、4 层)分别用四种方式输出。数据完全一样,变的只是空白和字节数。
| 排版 | 行数 | 大小(字节) | 比压缩版多 |
|---|---|---|---|
| 2 个空格 | 21 | 331 | +53% |
| 4 个空格 | 21 | 411 | +89% |
| Tab | 21 | 291 | +34% |
| 压缩成一行 | 1 | 217 | — |
对这条数据来说,缩进让原始大小多出三分之一到将近一倍。走 HTTP 时如果开了 gzip 或 Brotli,差距会小很多(重复的空格很好压缩),但请求体、请求头和日志行的长度限制通常按原始字节算。
JSON 为什么解析不了
大多数报错都出在下面几处,提示的列号一般正好落在上面。
把 JS 对象当 JSON
键名不加引号、单引号、末尾逗号、注释,在 JS 代码或 JSON5 配置里能用,严格 JSON 解析器都不认。
中文引号和全角符号
从 Word、微信、飞书里复制的 JSON 常被换成中文引号 “ ” 或全角逗号、冒号,看着没问题,一解析就报错。
长 ID 用数字传
超过 9,007,199,254,740,991 的整数在 JavaScript 里会丢精度,这里也一样。19 位的雪花 ID、Java Long 类型订单号要用字符串传。
JSON 被包成了字符串
形如 "{\"a\":1}" 的转义字符串本身合法,但格式化出来只是一个字符串。去掉外层引号和反斜杠转义后再贴进来。
事件数据,字段一直干净
发到 TapCub 的事件,属性都是 JSON:网页脚本、App 和小程序 SDK、服务端接口都一样。每条事件到达时都会校验,类型不对、少了属性,不会悄悄把报表带偏。
JSON 格式化是什么意思?
把一段 JSON 解析后按统一的排版重新输出:要阅读就每个键一行、带缩进;要传输就压成一行、去掉多余空白。因为必须先解析,它同时也是一个 JSON 校验工具。
怎么判断 JSON 格式对不对?
贴进上面的输入框。显示「JSON 格式正确」就说明严格的解析器能接受;否则会提示解析停在第几行第几列,问题就在那个字符或它前面,常见的是漏逗号、多逗号或引号没配对。
JSON 和 JS 对象有什么区别?
JS 对象字面量允许键名不加引号、单引号、末尾逗号、注释,还有只在 JavaScript 里才有的值,JSON 都不允许。JSON5、JSONC 这类配置格式放宽了部分规则,但接口和 JSON.parse 要的是严格 JSON。
格式化和压缩有什么区别?
格式化加换行和缩进,方便人看;压缩去掉所有可省的空白,体积更小。两者包含的数据完全一样。上面的算例里,压缩后从 331 字节降到 217 字节。
格式化后长数字为什么变了?
和大多数基于 JavaScript 的工具一样,这里的数字按 64 位浮点数存,只在 9,007,199,254,740,991 以内精确。19 位的雪花 ID 会被四舍五入。后端返回这类 ID 时应当转成字符串,前端也就不会丢精度。
\u4e2d\u6587 这样的内容怎么转成中文?
直接贴进来就行。JSON 里的 \uXXXX 是 Unicode 转义,格式化后会显示成对应的汉字,比如 \u4e2d\u6587 显示为「中文」。很多后端框架默认输出这种转义,看日志时用它最省事。
键的顺序为什么变了?
不勾排序时,键保持原来的顺序,只有一个来自 JavaScript 引擎的例外:长得像非负整数的键(如 "2"、"10")会按数字大小排到最前面。另外同一个键出现两次时只保留最后一个值。按规范 JSON 对象本来就是无序的,程序不该依赖键的顺序。
我贴的 JSON 会上传吗?
不会。解析和格式化都在你的浏览器里完成,不会发给 TapCub。这个工具也没有分享链接,贴进来的内容不会出现在网址里。不过把接口数据贴进任何在线工具之前,建议先去掉 token 和个人信息。