JSON 格式化、校验和压缩 - 开发中常见问题一次讲清

在前后端接口调试、配置文件编写、爬虫数据处理和日志分析中,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 经常会变得很长、很深、很乱。一旦缺少逗号、引号写错、括号不匹配,接口调试就会变得非常痛苦。

所以,开发者经常需要做三件事:

  1. 把 JSON 变得更容易阅读;

  2. 判断 JSON 语法是否合法;

  3. 把 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 压缩主要用于以下场景:

  1. 网络传输时减少数据体积;

  2. 写入数据库或缓存时节省空间;

  3. 将 JSON 作为参数传递时减少长度;

  4. 日志系统中降低存储成本;

  5. 复制到配置项、请求参数或命令行中更加方便。

不过在日常开发中,并不是所有 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"
数字 1003.14
布尔值 truefalse
空值 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 标签的开头。

排查方式:

  1. 打开浏览器 Network;

  2. 查看接口 Response;

  3. 确认响应内容是否为 JSON;

  4. 检查响应头 Content-Type

  5. 检查后端是否发生异常。

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 并不难,但越基础的东西越容易在细节上出错。把这些常见坑理解清楚,后续在接口调试、日志分析、数据清洗和前后端联调中都会更加高效。