JSON 格式化
在浏览器里格式化、压缩、校验 JSON。19 位雪花 ID 原样保留,标出重复键和会被 JavaScript 改掉的数字;报错给出行列和原因,带注释的 JSONC 可一键转 JSON。
- 在浏览器中处理
- 数据不离开你的设备
- 免费 · 无需注册
用微信扫描以下二维码即可分享
示例、说明与常见问题 带实际输出的示例、与同类工具的差别,以及常见问题。
19 位订单号:为什么前端拿到的数字不对
后端用 Java long 存雪花算法生成的 ID,序列化成 JSON 数字后,浏览器里的 JSON.parse 会把它变成双精度浮点数。RFC 8259 第 6 节写明:按 IEEE 754 双精度读取数字的软件,只能可靠交换 −(2^53 − 1) 到 2^53 − 1 之间的整数。下面是一段接口返回:
{"orderNo":1845223349876512769,"amount":"128.00","status":1,"buyer":{"nickname":"张三","phone":null}}
格式化结果(2 空格):
{
"orderNo": 1845223349876512769,
"amount": "128.00",
"status": 1,
"buyer": {
"nickname": "张三",
"phone": null
}
}
数字原样保留,同时提示「有 1 个数字被 JavaScript(JSON.parse)读取后会变」,列出 1845223349876512769 → 1845223349876512800(/orderNo,第 1 行)。前端要用这个字段,就让后端把它序列化成字符串。把「数字」改成「按 JavaScript 读取的值」,输出就和前端代码拿到的一致,方便对照排查。
小程序 app.json 里的注释
微信官方文档《小程序代码构成》写明:JSON 文件中无法使用注释,试图添加注释将会引发报错;还提到把双引号写成单引号是常见错误(来源)。从别处复制来的配置常带注释和尾逗号,直接粘进来会报错:
{
"pages": [
"pages/index/index",
// 订单页
"pages/order/order",
],
"window": {
"navigationBarTitleText": "小王咖啡"
}
}
状态行显示「第 4 行第 5 列:JSON 不允许注释」,输出区给出出错行和箭头:
3 | "pages/index/index",
4 | // 订单页
| ^
下方还会提示「这不是 JSON,但是有效的 JSON5 / JSONC:去掉 1 条注释、1 个尾逗号」。点「转为 JSON」:
{
"pages": [
"pages/index/index",
// 订单页
"pages/order/order",
],
"window": {
"navigationBarTitleText": "小王咖啡"
}
}
得到可以直接放回 app.json 的标准 JSON:
{
"pages": [
"pages/index/index",
"pages/order/order"
],
"window": {
"navigationBarTitleText": "小王咖啡"
}
}
转换按 JSON5 规范读取输入(VS Code 的 JSONC 是它的子集):十六进制数字改成十进制,.5 改成 0.5,单引号改成双引号。和 json5 2.2.3 对照的 103 个测试输入结果一致,只有 NaN 和 Infinity 被有意拒绝。
中文输入法带来的错误
输入法在中文状态下打出的冒号、逗号、引号是全角字符,JSON 不认:
{"name":"张三","city":"杭州"}
提示是「全角字符 :;JSON 的标点和空格必须是半角」,并指向第 1 行第 8 列:
1 | {"name":"张三","city":"杭州"}
| ^
常见错误与提示对照:
| 输入 | 提示 |
|---|---|
{"a":1,} | 右括号前多了一个逗号 |
{"a":“b”} | “ 是中文引号,JSON 要用英文双引号(“) |
{'a':1} | JSON 的字符串和属性名必须用双引号(“) |
{"ok": True} | 未知单词;JSON 只有 true、false、null,另提示 True 是 Python 写法 |
{"a":1} // 备注 | JSON 不允许注释 |
另外几种「差一点是 JSON」的输入会给出一键修复:被 Markdown 代码块(```)包着的 JSON(AI 对话里常见)、被转义成字符串的 JSON(日志里常见的 {\"a\":1})、整段是一个装着 JSON 的字符串。每行一个 JSON 的 JSON Lines 会提示改用 JSONL 转换器。
文件编码:GBK 文件打不开
RFC 8259 第 8.1 节要求交换的 JSON 用 UTF-8。Windows 记事本「ANSI」编码在简体中文系统上就是 GBK,「张三」存成 D5 C5 C8 FD 四个字节,不是合法的 UTF-8。本工具打开这类文件会报「文件不是 UTF-8:第 N 个字节开始的字节序列无效」,不会把乱码当成数据格式化。另存为 UTF-8 即可。带 BOM 的 UTF-16 文件会被解码并提示;开头的 BOM(U+FEFF)会被去掉,因为 JSON.parse 遇到它会报错。
和 jq、Python 的输出对照
python3 -m json.tool 默认把非 ASCII 字符写成 \uXXXX,中文会变成看不懂的转义。本工具默认保留中文;需要纯 ASCII 输出时勾选「转义非 ASCII」,4 空格下与 Python 3.12 的输出逐字节相同:
{"nickname":"张三","city":"杭州"}
输出:
{
"nickname": "\u5f20\u4e09",
"city": "\u676d\u5dde"
}
「键排序」按 Unicode 码点排序,和 jq -S、--sort-keys 相同。测试脚本每次都用 400 份随机文档对照 jq 1.7.1、120 份对照 Python 3.12(版本不符时跳过)。数字上三者有差别:jq 1.7.1 保留原文但把 1e2 改写成 1E+2;Python 把 1e2 写成 100.0,把 1e400 写成 Infinity(不是合法 JSON);本工具都按原文输出。
与其他工具的差别
2026-10-02 在桌面版 Chromium 中用 {"id":12345678901234567890,"price":19.90,"big":1e400,"z":-0,"a":1,"a":2} 实测,测试期间这些网站都没有把 JSON 发到服务器:
- Be JSON(bejson.com):数字和两个
a都按原文保留,但没有提示重复键;{"a":1,}报「第 1 行解析错误……期望是 ‘STRING’」;带注释的输入只报错,不能转换。 - 锤子在线工具(toolhelper.cn,cn.bing.com 搜「json格式化」第一):有效输入同样按原文保留;无效输入会先改写输入框再报错,
{"a":1,}被改成三行后报「line 4 column 1」,与原文对不上;带注释的输入里,// comment和下一行被拼成//commentname: 'api',,原文被破坏。 - 本工具:数字原样输出并列出 JavaScript 会改掉的值,重复键全部保留并标出位置,报错位置对应你粘贴的原文,JSONC 可转换。
FAQ
JSON 会上传到服务器吗?
不会。解析和格式化都在浏览器标签页里完成。输入内容会存在本浏览器的本地存储里,下次打开还在;点「清空」即删除。
为什么别的格式化工具把我的订单号改了?
多数在线工具用 JSON.parse 解析,所有数字都按 64 位双精度浮点数存放,超过 9007199254740991(2^53 − 1)的整数存不准,1845223349876512769 会变成 1845223349876512800。本工具按原文保留数字,并在提示里列出 JavaScript 会改掉的数字。
带注释的 JSON 能格式化吗?
能。勾选「接受 JSON5 / JSONC」,或在报错时点「转为 JSON」。注释会被删掉,尾逗号、单引号、未加引号的键会被改写,提示里列出每类改动的数量。NaN 和 Infinity 仍然报错,因为 JSON 没有对应写法。
格式化会改变数据吗?
值不变。改变的是空白和字符串里的转义写法:与 JSON.stringify 相同,\u5f20 写成「张」,\/ 写成 /。数字和重复键默认按原文保留。
最大能处理多大的文件?
可打开 50 MB 以内的文件。2 MB 以内边输入边格式化,超过后点「格式化」再处理。解析与格式化在 Web Worker 中运行,处理期间页面仍可操作;修改输入、再点「格式化」或「清空」会中止上一次处理。我们的测试(Apple M1 Max,Chromium 152,2026-10-03)中,10.7 MB 文件格式化用时 2~4 秒,把这么多文本放进输入框,浏览器本身用了 1~2 秒。