📅 2026-03-24⏱ 阅读约 12 分钟👤 适合初学者
本文目录
如果你刚刚开始学习编程,或者第一次在工作中接触 API 接口,你很可能已经见到过 JSON 了——那些看起来像 {"name":"张三","age":28} 的东西。本文将从零开始,彻底讲清楚 JSON 是什么、有什么用,以及如何正确使用它。
1. JSON 的定义与起源
JSON,全称 JavaScript Object Notation(JavaScript 对象表示法),是一种用于存储和传输数据的文本格式。尽管名字里有"JavaScript",但它早已独立于 JavaScript,成为几乎所有编程语言都支持的通用数据格式。
JSON 由美国程序员 Douglas Crockford 在 2001 年提出,2006 年被正式标准化(RFC 4627),并在 2017 年更新为最新规范 RFC 8259。今天,JSON 是互联网上最流行的数据交换格式,被 Google、Twitter、GitHub、微信等几乎所有互联网公司的 API 所采用。
为什么 JSON 能如此流行?因为它同时做到了两件看似矛盾的事:
- 人类可读: 普通人不需要专业工具,直接看文本就能理解数据内容
- 机器易解析: 计算机可以极快速地将 JSON 文本转换为内存中的数据结构
相比之下,此前流行的 XML 格式虽然功能强大,但标签冗余,同样的数据 XML 版本往往比 JSON 大 2-3 倍,解析也更复杂。JSON 凭借简洁性一举取代 XML,成为 Web API 的主流标准。
2. JSON 的六种数据类型
JSON 只有六种基本数据类型,比大多数编程语言都要简单:
① 字符串(String)
用双引号包裹的文本。注意:必须是双引号,单引号不合法。
"Hello, 世界"
"2024-01-15"
"user@example.com"
"这是一行\n有换行的文本" // \n 是换行符的转义表示
字符串中的特殊字符需要转义:
| 转义序列 | 含义 |
|---|---|
" | 双引号 |
\ | 反斜杠 |
\n | 换行符 |
\t | 制表符(Tab) |
\r | 回车符 |
\uXXXX | Unicode 字符(4位十六进制) |
② 数字(Number)
整数或浮点数,不加引号。支持负数和科学计数法,但不支持十六进制、NaN 和 Infinity。
42 // 整数
-7 // 负整数
3.14 // 浮点数
-0.001 // 负浮点数
2.5e10 // 科学计数法:25000000000
1.2E-5 // 科学计数法:0.000012
③ 布尔值(Boolean)
只有两个值,且必须全部小写:
true // 真
false // 假
④ 空值(Null)
表示"没有值"或"缺省",只有一个值,必须小写:
null
⑤ 对象(Object)
键值对的集合,用花括号 { } 包裹。键必须是字符串(双引号包裹),值可以是任意 JSON 类型。
{
"name": "张三",
"age": 28,
"isStudent": false,
"score": null
}
⑥ 数组(Array)
有序的值列表,用方括号 [ ] 包裹。元素可以是任意 JSON 类型,可以混合类型,可以嵌套。
["苹果", "香蕉", "橙子"]
[1, 2, 3, 4, 5]
[true, false, null, 42, "hello"]
[[1,2], [3,4], [5,6]] // 嵌套数组
3. JSON 对象与数组详解
对象和数组是 JSON 中最重要的结构,它们可以互相嵌套,表达任意复杂的数据。
对象的嵌套
{
"user": {
"id": 1001,
"name": "李明",
"address": {
"city": "上海",
"district": "浦东新区",
"zipCode": "200120"
}
}
}
要访问 city 字段,路径是:user → address → city,在 JavaScript 中写作 data.user.address.city。
数组中的对象(最常见的结构)
这是 API 中最常见的数据结构,表示一个列表,每个元素是一个对象:
{
"total": 3,
"users": [
{"id": 1, "name": "张三", "role": "admin"},
{"id": 2, "name": "李四", "role": "user"},
{"id": 3, "name": "王五", "role": "user"}
]
}
一个完整的真实世界 JSON 示例
{
"order": {
"id": "ORD-2024-001",
"status": "shipped",
"isPaid": true,
"totalAmount": 299.00,
"currency": "CNY",
"customer": {
"name": "赵六",
"phone": "138****8888",
"email": null
},
"items": [
{
"productId": "P001",
"name": "机械键盘",
"quantity": 1,
"price": 199.00
},
{
"productId": "P002",
"name": "鼠标垫",
"quantity": 2,
"price": 50.00
}
],
"shipping": {
"carrier": "顺丰",
"trackingNo": "SF1234567890",
"estimatedDelivery": "2024-01-20"
},
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-16T08:00:00Z"
}
}
💡 试试把上面这段 JSON 粘贴到我们的 格式化工具 中,观察它的树状结构!
4. JSON 的语法规则
JSON 的语法规则非常严格,以下是必须遵守的全部规则:
- 字符串必须用双引号——单引号不合法,包括键名
- 键名必须是字符串——不能是数字或裸标识符
- 不允许尾随逗号——对象或数组最后一个元素后面不能有逗号
- 不支持注释——
// 注释和/* 注释 */都不合法 - 不支持 undefined——值只能是 string/number/boolean/null/object/array
- 不支持 NaN 和 Infinity——这两个 JavaScript 特有值不是合法 JSON
- 数字不能有前导零——
007不合法,应写7 - 文件编码必须是 UTF-8——JSON 规范规定使用 UTF-8 编码
⚠️ 一个完整的 JSON 文本必须是一个值——可以是对象、数组、字符串、数字、布尔值或 null。顶层可以是任意类型,不一定非得是对象。
5. JSON 的应用场景
① Web API 数据传输
这是 JSON 最主要的用途。当你在手机上刷微博、搜索商品、查天气,后端服务器返回给前端的数据几乎都是 JSON 格式。例如,获取用户信息的 API 响应可能是:
HTTP/1.1 200 OK
Content-Type: application/json
{
"code": 0,
"message": "success",
"data": {
"userId": 12345,
"nickname": "码农小王",
"avatar": "https://cdn.example.com/avatar/12345.jpg",
"level": 5
}
}
② 项目配置文件
很多工具和框架使用 JSON 作为配置文件格式,例如:
package.json——Node.js 项目的包管理配置tsconfig.json——TypeScript 编译器配置settings.json——VS Code 编辑器设置manifest.json——Chrome 扩展程序清单appsettings.json——ASP.NET Core 应用配置
③ 数据库存储
MongoDB 使用类 JSON 的 BSON 格式存储数据;MySQL 5.7+、PostgreSQL 9.4+ 都支持原生 JSON 字段类型,可以直接存储和查询 JSON 数据。
④ 日志记录
结构化日志(Structured Logging)常使用 JSON 格式,方便日志分析系统(如 ELK Stack)解析:
{"timestamp":"2024-01-15T10:30:00Z","level":"ERROR","service":"payment","message":"支付失败","userId":1001,"amount":299.00,"errorCode":"INSUFFICIENT_BALANCE"}
6. JSON 与其他格式的关系
| 格式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| JSON | 简洁、快速、通用 | 不支持注释、无类型校验 | Web API、配置文件 |
| XML | 支持属性和命名空间 | 冗长、体积大 | 企业系统、文档存储 |
| YAML | 支持注释、更简洁 | 缩进敏感、解析慢 | DevOps 配置文件 |
| CSV | 极简、Excel 兼容 | 不支持嵌套结构 | 表格数据、批量导入 |
| Protobuf | 二进制、极快、极小 | 不可读、需要 Schema | 高性能内部通信 |
7. 如何读懂一段 JSON
遇到一段陌生的 JSON,按以下步骤来理解它:
- 看最外层结构——是
{ }还是[ ]?对象还是数组? - 找顶层键名——对象有哪些键?这些键揭示了数据的主要字段
- 关注值的类型——字符串表示文本,数字表示量,布尔表示开关,null 表示缺省,嵌套对象表示子结构,数组表示列表
- 展开嵌套——逐层深入,理解每个层级的含义
💡 使用我们的 JSON 格式化工具 可以为 JSON 添加语法高亮,让结构更清晰,大幅降低阅读难度。
8. 新手常见问题
Q:JSON 和 JavaScript 对象有什么区别?
JSON 是一种文本格式(字符串),JavaScript 对象是内存中的数据结构。JSON 是 JavaScript 对象语法的子集,但有更严格的限制:键名必须加引号、不支持 undefined、不支持函数、不支持日期对象(Date)。在 JavaScript 中用 JSON.parse() 将 JSON 字符串转为对象,用 JSON.stringify() 将对象转为 JSON 字符串。
Q:JSON 文件用什么扩展名?
JSON 文件使用 .json 扩展名,MIME 类型为 application/json。
Q:JSON 支持中文吗?
完全支持。JSON 使用 UTF-8 编码,可以包含任意 Unicode 字符,包括中文、日文、阿拉伯文等。也可以用 \uXXXX 的形式表示 Unicode 字符,例如 \u4e2d\u6587 表示"中文"。
Q:JSON 有大小限制吗?
JSON 规范本身没有大小限制,但实际应用中受限于解析器的内存和性能。大多数 Web 框架对请求体有默认限制(如 Nginx 默认 1MB),可以按需调整。