什么是 JSON?
JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种用纯文本表示结构化数据的标准格式。 它用少量固定语法把字符串、数字、布尔值、空值、对象和数组写成文本,方便不同程序保存和交换数据。

JSON 不是编程语言,也不是数据库。它只规定“数据转换成文本以后应该长什么样”,不负责执行逻辑、查询数据或长期管理数据。Python 可以生成 JSON,Java 可以读取它,JavaScript 再把结果展示在网页上;三种语言不需要理解彼此的源代码,只需遵守同一套格式。
JSON 的语法由 ECMA-404 描述,互联网交换时通常参考 RFC 8259。文件常使用 .json 扩展名,网络传输常使用 application/json 媒体类型。
一句话总结:JSON 是把结构化数据写成字符串的一套通用约定。
JSON 不是什么?
JSON 容易因为名字里的 JavaScript 和常见的 .json 文件,被误解成一门语言或一种存储系统。更准确的分类是“数据表示格式”。

| 概念 | 能做什么 | JSON 是否属于它 |
|---|---|---|
| 编程语言 | 表达条件、循环、函数和程序逻辑 | 否 |
| 数据库 | 持久化、查询、索引和并发管理数据 | 否 |
| 数据格式 | 约定数据如何编码、保存和传输 | 是 |
JavaScript 的对象字面量和 JSON 外观相似,但并不相同。JavaScript 对象可以包含函数、undefined、BigInt、Date、Map 等值,键在很多情况下也可以不加引号;标准 JSON 不允许这些写法。
因此,看到一段带大括号的文本,不能只凭外观判断它是合法 JSON,仍要按 JSON 语法解析。
JSON 为什么会成为数据交换的事实标准?
JSON 流行的根本原因,是它在机器处理、人类阅读和传输体积之间取得了实用平衡:语法足够简单,能表达嵌套数据,又没有 XML 那样大量重复的标签。

它被 Web API、配置文件和开发工具广泛采用,主要有五个原因:
- 跨语言:主流编程语言都有成熟的 JSON 编码和解析库。
- 容易解析:语法规则少,解析器可以直接把文本还原成对象、数组和基础值。
- 人能阅读:排版后的 JSON 可以直接查看字段名称、层级和值。
- 结构够用:对象和数组可以任意嵌套,能描述大多数 API 数据和配置树。
- Web 生态原生支持:浏览器提供
JSON.parse()和JSON.stringify(),HTTP 也有明确的application/json类型。
“轻量”不等于所有场景下最小。Protocol Buffers、MessagePack 等二进制格式通常能产生更紧凑的数据,并提供更强的类型约束;JSON 的优势是通用、透明和调试方便。
JSON 的对象和数组有什么区别?
JSON 用两种容器组织数据:对象保存名称和值的对应关系,数组保存按位置排列的有序值。两者可以互相嵌套,组成树状结构。

- 对象(object):用
{}包住一组键值对。键必须是双引号字符串,键和值之间用冒号:分隔,多组成员之间用逗号,分隔。 - 数组(array):用
[]包住一组有序值。数组项用逗号分隔,可以是六种 JSON 值中的任意一种。
下面是一段合法 JSON:
{
"name": "小明",
"age": 18,
"hobbies": ["足球", "画画", "阅读"]
}
严格来说,JSON 文本的最外层不一定非要是对象或数组。按照现行标准,"hello"、42、true 和 null 也可以成为完整 JSON 文本;只是 API 为了便于扩展,通常返回对象或数组。
JSON 怎样描述嵌套数据?
JSON 的嵌套来自对象和数组的组合。对象的值可以是数组,数组的元素也可以是对象,因此它能表达用户、订单、菜单和配置等层级数据。

例如,一个用户及其地址可以写成:
{
"name": "小明",
"age": 18,
"hobbies": ["足球", "画画", "阅读"],
"address": {
"city": "北京",
"postalCode": "100000"
}
}
这里的根节点是用户对象;hobbies 指向数组;address 又指向一个对象。解析器会保留这棵树的层级,调用方可以按 address.city 这样的路径读取数据。
嵌套不是越深越好。层级过深会增加阅读、校验和局部更新的成本;如果多个位置反复出现同一实体,通常应通过 ID 建立关联,或者重新设计接口结构。
JSON 支持哪六种值?
JSON 只支持六种值:字符串、数字、布尔值、null、对象和数组。前四种是基础值,后两种是可以继续容纳其他值的结构类型。

| 值类型 | 合法示例 | 关键规则 |
|---|---|---|
| 字符串 | "hello" | 必须使用双引号 |
| 数字 | 123.45、-6、1e3 | 不能写 NaN、Infinity 或 01 |
| 布尔值 | true、false | 必须小写,不能加引号 |
| 空值 | null | 表示明确的空值,不等于缺少字段 |
| 对象 | {"id": 1} | 键必须是字符串 |
| 数组 | [1, "a", true] | 元素有顺序,可以混合类型 |
JSON 没有日期、二进制、函数、正则表达式、undefined 或 BigInt 类型。日期通常编码为 ISO 8601 字符串,例如 "2026-09-27T10:30:00Z";二进制内容通常改用 Base64 字符串或外部文件 URL。
数字还有一个跨语言边界:JSON 标准不限制数字精度,但接收端语言会限制。JavaScript 的普通 Number 无法精确表示超过 2^53 - 1 的所有整数,因此长整型 ID 常编码成字符串。
JSON 有哪些必须记住的语法规则?
最常见的 JSON 解析错误来自三条硬规则:字符串和键使用双引号、最后一项后不能有逗号、标准 JSON 不支持注释。

合法写法:
{
"name": "小明",
"city": "北京",
"active": true
}
下面三段都不是合法 JSON:
{'name': '小明'} // 错:使用了单引号
{"name": "小明",} // 错:最后一项后有逗号
{"name": "小明" /* 用户 */} // 错:包含注释
此外还要记住这些规则:
- 对象成员和数组项之间必须有逗号,键和值之间必须有冒号。
- 字符串里的双引号、反斜杠和控制字符需要转义,例如
\"、\\、\n和\t。 - 空格、换行和制表符可以出现在结构符号周围,不会改变数据含义。
- 数字不能以
+开头,整数部分除0本身外不能以0开头。 - 对象的键应保持唯一。标准讨论了重复键的互操作问题,不同解析器可能保留第一个、最后一个或直接报错。
- 不要依赖对象键的顺序表达业务含义;需要顺序时使用数组。
判断一段文本是否合法,最可靠的方法是交给解析器,而不是只靠肉眼检查:
const text = '{"name":"小明","age":18}'
const user = JSON.parse(text)
const output = JSON.stringify(user, null, 2)
console.log(output)
JSON.parse() 把 JSON 文本解析成 JavaScript 值,JSON.stringify() 则把可序列化的 JavaScript 值转换成 JSON 文本。解析不可信输入后,仍要校验字段类型和业务约束。
JSON 最常用在哪些场景?
JSON 的典型用途可以分成三类:接口通信、配置文件,以及数据存储与系统交换。

- 接口通信:浏览器或移动端请求 API,服务端返回 JSON。客户端解析后,把字段渲染成列表、详情页或图表。
- 配置文件:
package.json、tsconfig.json等文件用 JSON 记录依赖、编译选项和脚本参数。 - 数据存储与交换:日志、爬虫结果、导入导出文件,以及不同系统之间的数据对接都可以使用 JSON。
一个 HTTP 响应可能如下:
HTTP/1.1 200 OK
Content-Type: application/json
{"id":"user_123","name":"小明","active":true}
JSON 只负责表示数据,不负责约定接口语义。字段是否必填、错误如何返回、版本怎样兼容,仍需要 API 文档或 Schema 明确说明。
JSON、XML 和 CSV 有什么区别?
JSON 适合通用的结构化数据交换;CSV 擅长扁平表格;XML 适合需要命名空间、属性、混合文本内容或成熟文档工具链的场景。三者没有绝对优劣,差别在数据模型和约束能力。

| 维度 | JSON | XML | CSV |
|---|---|---|---|
| 基本模型 | 对象、数组和基础值 | 元素、属性和文本节点 | 行与列 |
| 嵌套结构 | 原生支持 | 原生支持 | 不擅长 |
| 可读性 | 字段和值直观 | 标签明确,但通常更冗长 | 表格数据最直观 |
| 类型表达 | 有数字、布尔值、null 等基础类型 | 文本为主,可结合 Schema | 单元格通常按文本解释 |
| 注释 | 标准 JSON 不支持 | 支持 | 没有统一标准 |
| Schema | 可选 JSON Schema | XSD 等体系成熟 | 需另行约定 |
| 典型场景 | Web API、配置、系统对接 | 文档、企业集成、复杂标记 | 数据分析、批量表格导入导出 |
XML 需要成对标签,同样的对象型数据通常比 JSON 更冗长,但它可以表达属性、命名空间和混合内容。CSV 体积很小,却难以自然表示数组嵌对象,也没有统一方式区分数字、布尔值和字符串。
选择原则很直接:树状业务数据优先考虑 JSON,二维表格优先考虑 CSV,需要 XML 特有文档语义或既有标准时继续使用 XML。
JSON 有哪些边界和补充方案?
JSON 的简单来自取舍:它没有日期类型、注释、引用关系和内置 Schema,也不适合直接承载大体积二进制数据。

常见边界及工程处理方式如下:
| 边界 | 直接影响 | 常见处理方式 |
|---|---|---|
| 没有日期类型 | 接收方不知道时区和格式 | 统一使用带时区的 ISO 8601 字符串 |
| 没有注释 | 复杂配置难以解释 | 写外部文档;仅在工具明确支持时用 JSON5 或 YAML |
| 没有内置结构约束 | 缺字段、错类型也可能成功解析 | 使用 JSON Schema 或运行时校验库 |
| 不支持引用关系 | 重复实体可能造成冗余 | 使用 ID 关联,或在应用层定义引用规则 |
| 嵌套过深 | 阅读、校验和更新困难 | 拆分资源、降低层级、重新设计数据模型 |
| 文本体积较大 | 高频或大规模传输成本上升 | 压缩 HTTP 响应,或评估二进制格式 |
需要特别区分:JSON5 和 YAML 不是标准 JSON。它们可以改善手写配置体验,但不能直接发送给只接受 application/json 的接口。JSON Schema 也不会自动执行;应用必须主动调用验证器,才能检查必填字段、类型、范围和格式。
处理外部 JSON 时还应设置请求体大小、最大嵌套深度和解析超时,避免超大或恶意构造的输入耗尽内存。把解析结果合并进应用对象时,也要防范原型污染等应用层风险。
常见问题
JSON 和 JavaScript 对象是同一个东西吗?
不是。JSON 是文本格式,JavaScript 对象是程序运行时的值。JavaScript 对象可以包含函数、undefined、Date 等 JSON 不支持的内容;两者通常通过 JSON.stringify() 和 JSON.parse() 转换。
JSON 的键可以不加双引号吗?
不可以。标准 JSON 的对象键必须是双引号字符串。{name: "小明"} 是合法 JavaScript 对象字面量,但不是合法 JSON;正确写法是 {"name": "小明"}。
JSON 可以写注释吗?
标准 JSON 不支持 // 或 /* */ 注释。配置需要说明时,可以写配套文档、增加描述字段,或者在工具明确支持的前提下使用 JSON5、JSONC 或 YAML;这些格式不能被当成标准 JSON 直接传输。
JSON 能保存日期吗?
JSON 没有日期类型,只能把日期编码成字符串或数字。跨系统交换时通常使用 ISO 8601 字符串,并明确时区,例如 "2026-09-27T10:30:00Z"。
null、缺少字段和空字符串有什么区别?
三者含义不同。null 表示字段存在但值为空;缺少字段表示发送方没有提供该字段;"" 是一个长度为零的字符串。接口应在文档或 Schema 中明确各自语义,不能让调用方猜测。
JSON 适合保存图片或视频吗?
不适合直接保存大体积二进制内容。更常见的做法是把文件存到对象存储或文件服务,JSON 只保存 URL、文件名、大小和媒体类型等元数据。Base64 可以放进 JSON,但会增加体积和内存开销。
总结:如何一句话理解 JSON?

JSON 是用文本描述结构化数据的一套最小约定:它支持字符串、数字、布尔值、null、对象和数组六种值,并以对象 {} 和数组 [] 两种容器组合数据。
记住四点就能掌握它的核心:
- JSON 是数据格式,不是编程语言或数据库。
- 键和字符串必须用双引号,末尾不能多逗号,标准 JSON 不能写注释。
- 对象表达键值关系,数组表达有序列表,两者可以嵌套。
- JSON 靠简单、可读、跨语言和生态支持,成为 Web API 与系统交换数据的默认格式。
最终结论是:JSON 用六种值、两种容器和少量硬规则,在可读性与机器处理之间取得平衡,因此成为跨语言数据交换的通用语言。

