JSON 格式化工具
在线 JSON 格式化、压缩和校验工具。支持格式化美化、压缩优化和语法错误检测,自动定位错误行号。浏览器本地处理,数据不上传服务器。
位置:第 0 行,第 0 列
描述:
上下文:
什么是 JSON 格式化?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于 Web API、配置文件和数据存储。JSON 格式化是指将压缩的 JSON 数据添加缩进和换行,使其结构清晰、易于阅读和调试。
当 JSON 数据包含语法错误时,本工具会自动检测并提供错误描述和位置(行号和列号),并显示错误附近的上下文片段。压缩模式则移除所有不必要的空白字符,减小数据体积,适用于网络传输和存储。
JSON 工具的特点
- 格式化美化 — 添加 2 空格缩进和换行,让 JSON 结构一目了然
- 压缩优化 — 移除空白字符,最大程度减小数据体积
- 语法校验 — 自动检测 JSON 语法错误,精确定位到行号列号并显示上下文
- 一键复制 — 轻松复制格式化或压缩后的结果
- 本地处理 — 所有操作在浏览器本地完成,数据不上传服务器
JSON 格式化的常见场景
- API 调试 — 格式化 API 返回的 JSON 数据,便于查看数据结构
- 配置文件编辑 — 格式化 package.json、tsconfig.json 等配置文件
- 数据交换 — 压缩 JSON 数据减少网络传输体积
- 学习 JSON — 通过格式化快速理解 JSON 的数据层级结构
为什么 JSON 需要"格式化"和"压缩"?
JSON 数据的可读性和体积,很多时候是互相矛盾的。一个 JSON 文件在传输和存储时,通常被压缩成一行、去掉所有空格,这样才能最大限度缩小体积、节省带宽和存储空间;但当人需要查看、修改或调试这份数据时,压缩后的"一行大字"就几乎没法读了——根本看不清哪层嵌套、哪个键对应哪个值。
所以就有了两种需求:格式化把压缩的 JSON 加缩进、换行,让它层次分明、一眼看懂结构;压缩反过来去掉所有空白,让数据尽可能小。这两者正好互补——调试时用格式化,传输时用压缩。工具把两种模式都提供出来,你就能按需选择。
JSON 语法错误的常见原因
JSON 的语法其实很严格,一丁点都不允许错,常见的有:①多逗号(数组或对象最后一项后面多了个逗号);②用错引号(JSON 要求键和字符串值必须用双引号,不能用单引号);③多余的注释(JSON 不支持注释,加了 // 或 /* */ 会报错);④缺少闭合(漏了右花括号或右方括号);⑤布尔/数值形式错误。这些错误在压缩的 JSON 里很难发现,工具能定位到具体行列,省去你逐行排查的麻烦。
结果怎么用?
格式化后的 JSON 可以直接用于阅读、修改、填写配置文件或作为学习资料;压缩后的则适合作为接口数据、存储内容或网络传输的最小体积形式。若你还需要比较两份 JSON 或提取文本,可配合「文本对比」等工具使用。
JSON 格式化到底在做什么
很多人第一次用 JSON 格式化工具时,会下意识以为它在「解析」或「翻译」数据。其实不是。JSON 格式化只做一件事:调整数据的空白字符——也就是缩进、换行和空格——让原本挤在一行的结构变得层次分明、方便人眼阅读。它不会增删任何字段,不会修改任何键名或取值,也不会改变数据的类型。把同一个 JSON 先格式化再压缩,只要中间没人手动改动,前后两次得到的数据在语义上完全等价,任何程序解析出来的结果也一模一样。
这一点之所以重要,是因为 JSON 本质上是一种「序列化」格式:它把内存里的对象变成一段纯文本,方便在网络上传输、写进文件或存进数据库。RFC 8259(现行 JSON 标准,2017 年由 IETF 发布,替代了早期的 RFC 4627 与 RFC 7159)明确规定,JSON 文本由「空白、值、以及把值隔开的标点」组成,而空白字符的唯一作用就是分隔,对解析结果没有任何影响。换句话说,缩进多少格、换不换行、行尾有没有空格,都只是「给谁看」的问题,不是「数据是什么」的问题。
因此,当你把一段压缩成一行、没有任何空格的响应体粘贴进工具,点一下格式化,看到它被整齐地展开成一层层带缩进的树状结构,请记住:你看到的每一个值,和原来那行密密麻麻的字符里的值是同一个。工具没有「猜」任何东西,它只是把本来就存在的层级关系用空白显现出来。
格式化与压缩:只在一对空白上反向操作
「格式化」和「压缩(minify)」是同一枚硬币的两面。格式化往里加空白,把结构摊开;压缩从中抽空白,把所有内容压回一行。二者改动的范围完全相同——仅限于空白字符,绝不触碰数据本身。下面这个对照能说明问题:
压缩前(格式化态):
{ "user": { "name": "Tom", "age": 28, "tags": ["a", "b"] } }
压缩后(一行):
{"user":{"name":"Tom","age":28,"tags":["a","b"]}}
两段文本肉眼看差异很大,但任意一个 JSON 解析器读进去,得到的对象都包含相同的键、相同的值和相同的嵌套关系。区别只在「人读」和「机传」两种用途之间。调试接口、排查数据、手写配置文件时用格式化;写进请求体、存进缓存、塞进日志时用压缩,既能省带宽也能省存储空间。
JSON 最常见的 5 类语法错误
JSON 的语法比很多开发者想象的更苛刻:它从 JavaScript 里借了表示法,却刻意丢掉了一部分宽松度。下面这些错误在「看起来没毛病」的草稿里极其常见,而一旦出现在压缩成一行、没有任何缩进的 JSON 里,肉眼几乎不可能定位。本工具会把错误精确定位到行号和列号,你对照下表改即可。
| 错误类型 | 非法片段 | 合法片段 |
|---|---|---|
| 尾随逗号 Trailing comma | { "a": 1, } | { "a": 1 } |
| 键未加引号 Unquoted key | { name: "Tom" } | { "name": "Tom" } |
| 单引号字符串 Single quotes | { "name": 'Tom' } | { "name": "Tom" } |
| 注释 Comments | { // 姓名 "name": "Tom" } | { "name": "Tom" } |
| 括号不匹配 Missing bracket | { "a": [1, 2 } | { "a": [1, 2] } |
怎么用:最常被卡住的是「尾随逗号」——很多语言(如 JavaScript 对象、Python 的某些写法)允许最后一项后面留一个逗号,但 JSON 标准不允许,多一个逗号就会报错。其次是键名忘记加双引号,或者图省事用了单引号;RFC 8259 要求键必须是双引号包裹的字符串,单引号一律不认。注释这一条尤其让从 JavaScript 转过来的人困惑:你习惯了在代码里随手写 // 说明,但纯 JSON 文件里写了注释就等于写了非法字符。至于括号不匹配,在深层嵌套时最容易漏掉某一侧的方括号或花括号,这时工具报出的行列号就是最快的寻找起点。
真实算例:一段草稿如何变成合法 JSON
算例 1(键未加引号 + 尾随逗号):下面这段是从某个配置草稿里直接复制出来的,肉眼看似乎「应该能解析」:
{ name: 'Tom', }
它同时犯了两个错误:键名 name 没有双引号,字符串值 'Tom' 用了单引号,数组或对象的最后还多了一个逗号。本工具会报出类似「Unexpected token n」或「Expected double-quoted property name」的错误,并定位到 name 所在的那一行。按上面的规则逐条修正:
{ "name": "Tom" }
修正后,它变成一段完全符合 RFC 8259 的合法 JSON:双引号包裹键、双引号包裹字符串值、去掉尾随逗号。把修正后的文本粘回工具,错误提示消失,输出区给出格式化或压缩后的结果。这个例子的关键价值在于:你原本以为「差不多」的文本,和标准之间可能只差两三个字符,而人眼在压缩态下几乎找不到这些差别,工具的报错定位正是为此而生。
算例 2(深层嵌套):考虑这样一段响应体:
{"data":{"list":[{"id":1,"user":{"profile":{"name":"Tom"}}}]}}
它合法,但挤在一行里完全没法读。点格式化后,工具把它展开为带缩进的树:data 下挂 list,list 是一个数组,数组第一项是一个对象,对象里有 id 和 user,user 里又有 profile,profile 里才是 name。通过这个例子你能直观看到:嵌套越深,空白带来的可读性收益越大。
为什么 JSON 不允许注释?
这是 JSON 设计者 Douglas Crockford 一个有意为之的决定。早期 JSON 确实讨论过要不要支持注释,最终被否决,原因是:一旦允许注释,人们就会开始往注释里写「暂时注释掉但以后可能恢复」的配置,导致同一份数据出现多个「版本」,解析器也会因为「该不该忽略这段注释」而产生分歧。为了保持 JSON 作为「纯粹数据交换格式」的定位——即一份文本在任何语言、任何解析器下都得到完全一致的结果——注释被彻底排除。如果你确实需要给数据加说明,通行的做法是把注释写成一个普通字段,例如 "_note": "这是说明",或者用单独的文档、独立的配置文件来承载说明文字,而不是塞进 JSON 本身。
格式化会改变 JSON 的数据内容吗?
不会。格式化只增减空白字符(空格、制表符、换行),对数据的键、值、类型、嵌套层级一律不动。你可以做一个简单的反验:把任意一段合法 JSON 先压缩成一行,再格式化展开,再做一次压缩,只要中间没有手动编辑,首尾两次的文本在去除空白后应当逐字符相同。需要提醒的是,「不改变内容」指的是语义不变;如果你是在做字符串级别的精确比对(比如校验哈希值、做签名),那压缩版和格式化版的字节确实不一样,因为空白字符本身也是字节。所以涉及数字签名、内容哈希或二进制比对时,务必约定好统一的空白规范,再进行比较。
嵌套层级很深的 JSON 怎么快速读懂?
深层 JSON 最大的难点是「迷路」:你看到一个值,却不知道它挂在哪条路径上。几个实用办法:第一,先用本工具的格式化展开,让每一层缩进清晰地对应一层嵌套;第二,沿着缩进从外往里数,每一级缩进代表一层,花括号 { } 表示对象、方括号 [ ] 表示数组,遇到 [ 就说明接下来是一组有序项;第三,关注「路径」而不仅是「值」,例如上面算例 2 里 name 的完整路径是 data.list[0].user.profile.name,用这种点号路径去和接口文档对照,定位会快得多;第四,如果嵌套实在太深、人眼仍然吃力,可以结合「文本对比」工具把两次响应的格式化结果并排比较,差异往往就藏在某一层里。
JSON 和 YAML 有什么区别,什么场景该用哪个?
两者都是人类可读的数据序列化格式,但取向不同。JSON 语法严格、容错极低,任何一点偏差都会解析失败,这反而让它成为机器之间交换数据的首选——Web API、配置文件(如 package.json)、NoSQL 存储几乎都用 JSON,因为解析快、无歧义。YAML 则宽松得多:它允许注释、允许省略引号、用缩进表达层级(而不是大括号),写起来更像自然语言,因此常被用于需要人频繁手写和阅读的场景,比如 CI/CD 流水线配置(GitHub Actions、GitLab CI)、Kubernetes 清单、Docker Compose 文件。简单说:凡是「程序生成、程序消费」的数据,用 JSON 更稳;凡是「人写、人读、还要加注释」的配置,用 YAML 更舒服。注意 YAML 对缩进敏感,且某些看似数值的字符串(如 2026-01-01)会被自动推断为日期类型,这是它相比 JSON 更容易踩坑的地方。如果你手上的数据需要在两者间转换,可以先格式化为规范的 JSON,再借助支持 YAML 的编辑器或工具转换,而不要让 JSON 里出现 YAML 才支持的注释或单引号。
如果你的 JSON 里混入了不可见字符(比如从网页或聊天工具复制时带进来的零宽字符、BOM 头),先到文本清洗工具清理一遍,再回来格式化,往往能省去反复排查的麻烦。需要把结构化 JSON 顺便写成文档说明时,可以配合Markdown 预览工具;而当你要从一段杂乱文本里抽取符合某种规律的内容时,正则表达式测试器能帮你先验证规则是否写对。