在前后端接口调试、配置文件编写、爬虫数据处理和日志分析中,JSON 几乎每天都会出现。很多开发者知道 JSON 可以"格式化",但对 JSON 校验、压缩、转义、语法错误定位并不完全清楚。本文系统讲清楚 JSON 格式化、校验和压缩的区别,以及常见错误和处理方法。
目录
[一、JSON 是什么?为什么开发中经常遇到它?](#一、JSON 是什么?为什么开发中经常遇到它?)
[二、JSON 格式化、校验和压缩分别是什么?](#二、JSON 格式化、校验和压缩分别是什么?)
[三、JSON 格式化:解决"看不懂"的问题](#三、JSON 格式化:解决“看不懂”的问题)
[1. 格式化适合什么场景?](#1. 格式化适合什么场景?)
[2. 格式化不会修复错误 JSON](#2. 格式化不会修复错误 JSON)
[四、JSON 校验:解决"对不对"的问题](#四、JSON 校验:解决“对不对”的问题)
[1. 常见 JSON 语法错误](#1. 常见 JSON 语法错误)
[错误二:key 没有加双引号](#错误二:key 没有加双引号)
[错误三:注释写进 JSON](#错误三:注释写进 JSON)
[错误五:中文符号混入 JSON](#错误五:中文符号混入 JSON)
[五、JSON 压缩:解决"太长"的问题](#五、JSON 压缩:解决“太长”的问题)
[1. 为什么要压缩 JSON?](#1. 为什么要压缩 JSON?)
[2. 什么时候不建议压缩?](#2. 什么时候不建议压缩?)
[六、JSON 和 JavaScript 对象有什么区别?](#六、JSON 和 JavaScript 对象有什么区别?)
[1. JSON 支持哪些数据类型?](#1. JSON 支持哪些数据类型?)
[七、开发中常见的 JSON 问题](#七、开发中常见的 JSON 问题)
[1. 后端返回的不是标准 JSON](#1. 后端返回的不是标准 JSON)
[2. JSON 字符串被重复转义](#2. JSON 字符串被重复转义)
[3. 数字精度丢失](#3. 数字精度丢失)
[4. null、空字符串和字段不存在混用](#4. null、空字符串和字段不存在混用)
[5. 数组和对象结构不一致](#5. 数组和对象结构不一致)
[八、如何快速定位 JSON 错误?](#八、如何快速定位 JSON 错误?)
[第一步:确认拿到的是不是 JSON](#第一步:确认拿到的是不是 JSON)
[九、Python 中如何处理 JSON?](#九、Python 中如何处理 JSON?)
[1. JSON 字符串转 Python 字典](#1. JSON 字符串转 Python 字典)
[2. Python 字典转 JSON 字符串](#2. Python 字典转 JSON 字符串)
[3. Python 格式化输出 JSON](#3. Python 格式化输出 JSON)
[4. Python 压缩 JSON](#4. Python 压缩 JSON)
[十、JavaScript 中如何处理 JSON?](#十、JavaScript 中如何处理 JSON?)
[1. JSON 字符串转对象](#1. JSON 字符串转对象)
[2. 对象转 JSON 字符串](#2. 对象转 JSON 字符串)
[3. 格式化 JSON 字符串](#3. 格式化 JSON 字符串)
一、JSON 是什么?为什么开发中经常遇到它?
JSON,全称是 JavaScript Object Notation ,中文通常称为 JavaScript 对象表示法。虽然名字里带有 JavaScript,但 JSON 早已经不只是前端或 JavaScript 的专属格式,而是现代软件开发中最常见的数据交换格式之一。
在实际开发中,JSON 常见于以下场景:
| 场景 | JSON 的作用 |
|---|---|
| 前后端接口 | 后端返回 JSON,前端解析后渲染页面 |
| 移动端接口 | App、小程序通过 JSON 与服务端通信 |
| 配置文件 | 一些工具、框架使用 JSON 保存配置 |
| 日志系统 | 结构化日志经常使用 JSON 格式 |
| 爬虫采集 | 很多网页接口直接返回 JSON 数据 |
| 数据清洗 | CSV、Excel、数据库数据经常需要转成 JSON |
| AI 应用 | 大模型接口、结构化输出经常使用 JSON |
例如,一个接口可能返回下面这段 JSON:
{
"code": 200,
"message": "success",
"data": {
"userId": 1001,
"username": "zhangsan",
"roles": ["admin", "editor"],
"active": true
}
}
这段内容看起来很简单,但在真实项目里,JSON 经常会变得很长、很深、很乱。一旦缺少逗号、引号写错、括号不匹配,接口调试就会变得非常痛苦。
所以,开发者经常需要做三件事:
-
把 JSON 变得更容易阅读;
-
判断 JSON 语法是否合法;
-
把 JSON 压缩成更小的体积。
这三件事分别对应:
-
JSON 格式化;
-
JSON 校验;
-
JSON 压缩。
很多人会把这几个概念混在一起,但它们解决的问题完全不同。
二、JSON 格式化、校验和压缩分别是什么?
先给出一个直观结论:
| 操作 | 主要目的 | 是否改变数据含义 | 常见使用场景 |
|---|---|---|---|
| JSON 格式化 | 提高可读性 | 不改变 | 接口调试、日志查看、排查问题 |
| JSON 校验 | 判断语法是否合法 | 不改变 | 定位错误、检查接口返回 |
| JSON 压缩 | 减少体积 | 不改变 | 网络传输、存储、复制粘贴 |
| JSON 转义 | 让 JSON 成为字符串内容 | 可能改变表现形式 | 嵌套传输、代码字符串、日志字段 |
其中最容易混淆的是 格式化 和 校验。
很多人以为"JSON 能格式化成功,就说明一定没问题"。这个说法在大多数工具里接近正确,但并不严谨。因为格式化的前提通常是 JSON 语法已经合法,工具才能正确解析;而校验的重点是明确告诉开发者:这段 JSON 到底哪里有语法错误。
简单理解:
-
格式化:让 JSON 好看;
-
校验:判断 JSON 对不对;
-
压缩:让 JSON 更短;
-
转义:让 JSON 能放进字符串里。
三、JSON 格式化:解决"看不懂"的问题
JSON 格式化的核心作用是:
通过缩进、换行和层级结构,让 JSON 更容易阅读。
例如,接口返回的数据可能是这样:
{"code":200,"message":"success","data":{"userId":1001,"username":"zhangsan","roles":["admin","editor"],"active":true}}
这段 JSON 是合法的,但可读性很差。字段少的时候还能看,字段一多就非常难定位。
格式化之后:
{
"code": 200,
"message": "success",
"data": {
"userId": 1001,
"username": "zhangsan",
"roles": [
"admin",
"editor"
],
"active": true
}
}
格式化并没有改变数据本身,只是改变了展示方式。
1. 格式化适合什么场景?
JSON 格式化通常适用于:
-
查看接口返回结果;
-
分析日志中的 JSON 字段;
-
对比两个 JSON 数据结构;
-
排查字段缺失或字段层级错误;
-
将压缩 JSON 还原为可读结构;
-
阅读第三方接口文档中的示例数据。
例如在后端开发中,经常需要看接口返回是否符合约定:
{
"code": 200,
"message": "success",
"data": {
"list": [
{
"id": 1,
"name": "Python"
},
{
"id": 2,
"name": "Java"
}
],
"total": 2
}
}
如果不格式化,这类嵌套结构非常难阅读。尤其是 data.list[0].name 这种字段路径,只有格式化之后才能快速判断层级是否正确。
2. 格式化不会修复错误 JSON
需要特别注意:
JSON 格式化不是自动修复工具。
如果 JSON 本身语法错误,格式化通常会失败。
例如:
{
"name": "zhangsan",
"age": 18,
}
这段 JSON 在很多编程语言中会报错,因为最后一个字段后面多了一个逗号。很多 JavaScript 对象写法允许尾随逗号,但标准 JSON 不允许。
再比如:
{
name: "zhangsan",
age: 18
}
这也不是合法 JSON,因为 JSON 的 key 必须使用双引号包裹。
正确写法应该是:
{
"name": "zhangsan",
"age": 18
}
格式化只能让合法 JSON 更易读,不能把错误 JSON 自动变成正确 JSON。
四、JSON 校验:解决"对不对"的问题
JSON 校验的作用是:
判断一段 JSON 是否符合标准语法。
这一步在接口调试和数据处理里非常重要。因为很多时候接口报错、解析失败,并不是业务逻辑有问题,而是 JSON 本身写错了。
1. 常见 JSON 语法错误
下面这些错误非常常见。
错误一:使用单引号
错误写法:
{
'name': 'zhangsan'
}
正确写法:
{
"name": "zhangsan"
}
JSON 标准要求字符串必须使用双引号,不能使用单引号。
错误二:key 没有加双引号
错误写法:
{
name: "zhangsan",
age: 18
}
正确写法:
{
"name": "zhangsan",
"age": 18
}
这也是很多从 JavaScript 对象写法迁移到 JSON 时容易犯的错误。
JavaScript 对象可以这样写:
const user = {
name: "zhangsan",
age: 18
}
但 JSON 不能这样写。JSON 的字段名必须是字符串,也就是必须加双引号。
错误三:注释写进 JSON
错误写法:
{
// 用户名称
"name": "zhangsan"
}
标准 JSON 不支持注释。虽然部分配置文件格式支持类似 JSON 的注释写法,但那已经不是严格意义上的标准 JSON。
正确写法:
{
"name": "zhangsan"
}
如果确实需要说明字段含义,可以在文档中说明,或者通过字段名表达含义。
错误四:括号不匹配
错误写法:
{
"user": {
"name": "zhangsan",
"age": 18
}
这段 JSON 少了一个右花括号。正确写法应该是:
{
"user": {
"name": "zhangsan",
"age": 18
}
}
在嵌套层级比较深时,括号不匹配非常常见。格式化工具和校验工具可以快速暴露这个问题。
错误五:中文符号混入 JSON
错误写法:
{
"name": "zhangsan"
}
这里使用的是中文双引号,不是英文双引号。看起来很像,但程序解析时会报错。
正确写法:
{
"name": "zhangsan"
}
很多人从 Word、微信、网页文本里复制 JSON 时,会不小心把英文符号变成中文符号。
常见错误包括:
| 错误符号 | 正确符号 |
|---|---|
| " " | " " |
| ' ' | ' ' |
| , | , |
| : | : |
| 【 】 | |
| ( ) | ( ) |
JSON 对符号非常敏感,中文标点很容易导致校验失败。
这类问题可以直接复制到在线 JSON 工具中校验。工具会先尝试解析 JSON,如果语法不合法,通常会提示错误位置或解析失败原因。JSON 格式化、校验、转换(XML/YAML/Java/C#)、JSONPath、Diff 等一体化工具。在线完成JSON格式化、校验、压缩、转换、JSONPath查询和差异对比,适合接口调试与配置检查。
https://mytoolbang.com/dev-tools/json-toolbox
五、JSON 压缩:解决"太长"的问题
JSON 压缩的核心作用是:
去掉不必要的空格、缩进和换行,让 JSON 体积更小。
例如格式化后的 JSON:
{
"code": 200,
"message": "success",
"data": {
"userId": 1001,
"username": "zhangsan"
}
}
压缩后会变成:
{"code":200,"message":"success","data":{"userId":1001,"username":"zhangsan"}}
这两个 JSON 的数据含义完全一样。
1. 为什么要压缩 JSON?
JSON 压缩主要用于以下场景:
-
网络传输时减少数据体积;
-
写入数据库或缓存时节省空间;
-
将 JSON 作为参数传递时减少长度;
-
日志系统中降低存储成本;
-
复制到配置项、请求参数或命令行中更加方便。
不过在日常开发中,并不是所有 JSON 都需要压缩。
2. 什么时候不建议压缩?
在下面这些场景里,不建议优先使用压缩 JSON:
-
接口调试阶段;
-
代码审查阶段;
-
配置文件人工维护阶段;
-
排查线上问题时;
-
编写接口文档时。
原因很简单:压缩后的 JSON 不利于阅读。
例如:
{"code":200,"data":{"list":[{"id":1,"name":"A"},{"id":2,"name":"B"},{"id":3,"name":"C"}],"total":3},"message":"success"}
这段内容虽然体积小,但排查问题时很难看清楚层级。开发调试阶段更适合使用格式化 JSON,正式传输或存储时再考虑压缩。我们同样可以使用在线JSON工具来进行处理

在接口调试、日志分析或复制接口返回值时,可以先用 JSON 工具格式化查看层级结构;确认没有问题后,再根据需要压缩成一行。
六、JSON 和 JavaScript 对象有什么区别?
很多开发者第一次接触 JSON,容易把它和 JavaScript 对象混在一起。两者确实很像,但不能完全等同。
看一个 JavaScript 对象:
const user = {
name: "zhangsan",
age: 18,
isAdmin: false,
sayHello: function () {
console.log("hello")
}
}
这不是 JSON,而是 JavaScript 对象。
标准 JSON 只能表示数据,不能表示函数、变量、表达式。
合法 JSON 示例:
{
"name": "zhangsan",
"age": 18,
"isAdmin": false
}
1. JSON 支持哪些数据类型?
JSON 支持的数据类型主要有:
| 类型 | 示例 |
|---|---|
| 字符串 | "hello" |
| 数字 | 100、3.14 |
| 布尔值 | true、false |
| 空值 | null |
| 对象 | { "name": "zhangsan" } |
| 数组 | [1, 2, 3] |
JSON 不支持:
-
函数;
-
undefined;
-
注释;
-
日期对象;
-
正则对象;
-
NaN;
-
Infinity;
-
单引号字符串;
-
未加引号的 key。
例如下面这个不是合法 JSON:
{
"name": "zhangsan",
"birthday": new Date(),
"score": NaN,
"value": undefined
}
如果需要传递日期,通常使用字符串或时间戳:
{
"name": "zhangsan",
"birthday": "2026-06-18",
"createdAt": 1781760000000
}
七、开发中常见的 JSON 问题
1. 后端返回的不是标准 JSON
有时候前端请求接口时,代码看起来没问题,但 JSON.parse() 报错。原因可能是后端返回的不是标准 JSON。
例如后端返回:
success
或者返回:
<html>
<body>500 Internal Server Error</body>
</html>
前端如果直接当成 JSON 解析,就会报错。
常见错误包括:
Unexpected token < in JSON at position 0
这个错误通常说明接口返回的是 HTML,而不是 JSON。< 很可能来自 HTML 标签的开头。
排查方式:
-
打开浏览器 Network;
-
查看接口 Response;
-
确认响应内容是否为 JSON;
-
检查响应头
Content-Type; -
检查后端是否发生异常。
2. JSON 字符串被重复转义
有时候接口返回的数据像这样:
{
"data": "{\"name\":\"zhangsan\",\"age\":18}"
}
这里的 data 不是一个对象,而是一个字符串。字符串里面又包了一层 JSON。
这时前端第一次解析后得到:
{
data: "{\"name\":\"zhangsan\",\"age\":18}"
}
如果想拿到里面的 name,还需要对 data 再解析一次:
const res = {
data: "{\"name\":\"zhangsan\",\"age\":18}"
}
const user = JSON.parse(res.data)
console.log(user.name)
这种情况在日志、消息队列、数据库字段存储中很常见。
3. 数字精度丢失
JSON 本身可以表示数字,但不同语言对数字精度的处理不一样。
例如下面这个 ID:
{
"orderId": 9007199254740993123
}
这个数字非常大,在 JavaScript 中可能出现精度丢失。为了避免问题,很多系统会把大整数 ID 转成字符串:
{
"orderId": "9007199254740993123"
}
在订单号、雪花 ID、长整型主键、支付流水号等场景中,这一点尤其重要。
4. null、空字符串和字段不存在混用
下面三种情况含义不同:
{
"name": null
}
{
"name": ""
}
{}
它们分别表示:
| 写法 | 含义 |
|---|---|
"name": null |
字段存在,但值为空 |
"name": "" |
字段存在,值是空字符串 |
| 没有 name 字段 | 字段不存在 |
在接口设计中,这三种情况最好保持统一,否则前端、后端、数据分析都会出现额外判断逻辑。
5. 数组和对象结构不一致
有时候后端返回的数据结构不稳定。
第一次返回:
{
"data": {
"id": 1,
"name": "A"
}
}
第二次返回:
{
"data": [
{
"id": 1,
"name": "A"
}
]
}
这里 data 一会儿是对象,一会儿是数组,会导致前端解析逻辑混乱。
接口设计时应该尽量保持结构稳定:
{
"data": [
{
"id": 1,
"name": "A"
}
]
}
即使只有一条数据,也保持数组结构,这样前端处理会更简单。
八、如何快速定位 JSON 错误?
当遇到 JSON 解析失败时,可以按照下面的步骤排查。
第一步:确认拿到的是不是 JSON
不要一上来就怀疑代码。先看接口返回内容。
如果返回的是 HTML、普通文本、空字符串,都不是合法 JSON。
第二步:检查首尾括号
JSON 顶层通常是对象或数组:
{
"name": "zhangsan"
}
或者:
[
{
"id": 1
},
{
"id": 2
}
]
如果开头是 {,结尾通常应该是 }。
如果开头是 [,结尾通常应该是 ]。
第三步:检查引号
重点检查:
-
key 是否使用双引号;
-
字符串是否使用双引号;
-
是否混入中文引号;
-
字符串内部双引号是否正确转义。
例如:
{
"text": "他说:\"hello\""
}
字符串内部如果需要出现双引号,需要使用反斜杠转义。
第四步:检查逗号
重点检查:
-
字段之间是否缺少逗号;
-
最后一个字段后面是否多了逗号;
-
数组元素之间是否缺少逗号。
错误写法:
{
"name": "zhangsan"
"age": 18
}
正确写法:
{
"name": "zhangsan",
"age": 18
}
第五步:检查特殊值
JSON 不支持下面这些值:
undefined
NaN
Infinity
new Date()
function () {}
如果接口里需要表达空值,使用 null:
{
"value": null
}
九、Python 中如何处理 JSON?
Python 开发中经常需要解析 JSON、生成 JSON、格式化 JSON。
Python 内置了 json 模块,可以直接使用。
1. JSON 字符串转 Python 字典
import json
json_str = '{"name": "zhangsan", "age": 18}'
data = json.loads(json_str)
print(data["name"])
print(data["age"])
输出:
zhangsan
18
这里的 json.loads() 是把 JSON 字符串解析成 Python 对象。
2. Python 字典转 JSON 字符串
import json
data = {
"name": "zhangsan",
"age": 18,
"skills": ["Python", "SQL", "Django"]
}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
输出:
{"name": "zhangsan", "age": 18, "skills": ["Python", "SQL", "Django"]}
其中 ensure_ascii=False 很重要。如果不加这个参数,中文可能会被转成 Unicode 编码形式。
例如:
import json
data = {
"name": "张三"
}
print(json.dumps(data))
print(json.dumps(data, ensure_ascii=False))
输出类似:
{"name": "\u5f20\u4e09"}
{"name": "张三"}
在中文项目中,通常建议加上:
ensure_ascii=False
3. Python 格式化输出 JSON
import json
data = {
"code": 200,
"message": "success",
"data": {
"name": "张三",
"age": 18
}
}
print(json.dumps(data, ensure_ascii=False, indent=2))
输出:
{
"code": 200,
"message": "success",
"data": {
"name": "张三",
"age": 18
}
}
其中:
-
indent=2表示缩进 2 个空格; -
ensure_ascii=False表示中文正常显示。
4. Python 压缩 JSON
如果不传 indent 参数,默认就是较紧凑的形式。还可以使用 separators 进一步压缩:
import json
data = {
"name": "张三",
"age": 18,
"skills": ["Python", "SQL"]
}
json_str = json.dumps(
data,
ensure_ascii=False,
separators=(",", ":")
)
print(json_str)
输出:
{"name":"张三","age":18,"skills":["Python","SQL"]}
这种写法会去掉冒号和逗号后面的空格,适合需要压缩 JSON 的场景。
十、JavaScript 中如何处理 JSON?
前端开发中,JSON 处理主要依赖两个方法:
-
JSON.parse():JSON 字符串转对象; -
JSON.stringify():对象转 JSON 字符串。
1. JSON 字符串转对象
const jsonStr = '{"name":"zhangsan","age":18}'
const user = JSON.parse(jsonStr)
console.log(user.name)
console.log(user.age)
2. 对象转 JSON 字符串
const user = {
name: "zhangsan",
age: 18
}
const jsonStr = JSON.stringify(user)
console.log(jsonStr)
输出:
{"name":"zhangsan","age":18}
3. 格式化 JSON 字符串
JSON.stringify() 的第三个参数可以控制缩进。
const user = {
name: "zhangsan",
age: 18,
skills: ["JavaScript", "Vue", "React"]
}
const jsonStr = JSON.stringify(user, null, 2)
console.log(jsonStr)
输出:
{
"name": "zhangsan",
"age": 18,
"skills": [
"JavaScript",
"Vue",
"React"
]
}
其中第三个参数 2 表示缩进 2 个空格。
十一、什么时候用格式化?什么时候用压缩?
可以用下面这张表快速判断。
| 场景 | 推荐操作 | 原因 |
|---|---|---|
| 看接口返回 | 格式化 | 方便阅读层级 |
| 排查字段问题 | 格式化 + 校验 | 先确认合法,再看结构 |
| 写接口文档 | 格式化 | 便于读者理解 |
| 网络传输 | 压缩 | 减少体积 |
| 存储日志 | 视情况压缩 | 降低存储成本 |
| 复制到请求参数 | 压缩 | 避免换行造成问题 |
| 检查语法错误 | 校验 | 找出具体错误 |
| 嵌套到字符串里 | 转义 | 避免引号冲突 |
简单总结:
-
给人看:优先格式化;
-
给机器传:可以压缩;
-
不确定对不对:先校验;
-
要放进字符串:考虑转义。
十二、在线工具快速处理
在日常开发中,JSON 问题有时候并不复杂,但手动排查非常浪费时间。比如:
-
接口返回内容太长,看不清结构;
-
不确定 JSON 是否合法;
-
想把一行 JSON 格式化;
-
想把格式化 JSON 压缩成一行;
-
想检查是不是多了逗号、少了引号;
-
想临时处理一段日志里的 JSON 字段。
这类场景可以使用在线 JSON 工具快速处理。
如果只是想临时格式化、校验或压缩 JSON,可以使用工具帮 这个中文在线工具箱,超级好用又齐全的工具站:
JSON格式化校验转换工具 - 在线JSON工具箱 | 工具帮在线工具箱
工具只是辅助,真正重要的是理解 JSON 的基本语法和常见错误。理解原理之后,再配合工具处理,效率会高很多。
十三、总结
JSON 是开发中最常见的数据交换格式之一。格式化、校验和压缩看起来都和 JSON 处理有关,但它们解决的问题不同:格式化解决可读性问题,校验解决语法正确性问题,压缩解决体积问题。
在实际开发中,遇到 JSON 解析失败时,不要只盯着业务代码。更合理的排查顺序是:先确认接口返回内容是不是 JSON,再检查引号、逗号、括号、中文标点、特殊值和字段结构。
对于开发者来说,JSON 并不难,但越基础的东西越容易在细节上出错。把这些常见坑理解清楚,后续在接口调试、日志分析、数据清洗和前后端联调中都会更加高效。