JSON(JavaScript Object Notation)是一种轻量的文本格式,用来存储和交换结构化数据。它驱动着绝大多数 Web API、大多数应用配置文件以及无数数据库。如果你见过 REST API 的响应,或打开过一份 package.json 文件,你就已经读过 JSON 了。本指南讲清楚 JSON 究竟是什么、格式长什么样,以及它为何成为数据交换的通用语言。
什么是 JSON?
JSON 的全称是 JavaScript Object Notation。它由 Douglas Crockford 在 2000 年代初创建,作为一种更简单的、用于 Web 服务器与浏览器之间交换数据的 XML 替代方案。尽管名字里带「JavaScript」,JSON 是与语言无关的 —— 每种主流编程语言都内置了 JSON 解析器。
该格式由两份国际标准定义:IETF 的 RFC 8259(历史与关键变化)与 Ecma International 的 ECMA-404。两者讲的是同一件事:JSON 是一段 Unicode 字符序列,表示六种数据类型之一,并以 UTF-8 编码。
JSON 的六种数据类型
JSON 恰好支持六种值类型。理解它们是理解 JSON 格式的基础。
1. 对象(Object)
用花括号包起来的一组无序键值对。键必须是字符串(双引号)。值可以是任意 JSON 类型。
{
"name": "Alice",
"age": 30,
"active": true
}2. 数组(Array)
用方括号包起来的一个有序值列表。
["apple", "banana", "cherry"]3. 字符串(String)
用双引号包起来的一段 Unicode 字符。单引号不是合法的 JSON。
"Hello, world!"4. 数字(Number)
整数或浮点数。JSON 没有单独的整数与浮点类型 —— 只有一种 number。不带引号、不支持十六进制字面值、也没有 NaN 或 Infinity。
42
3.14
-7
1.5e105. 布尔(Boolean)
只有小写的 true 或 false。JSON 不接受 True、False、yes、no、1 或 0 作为布尔值。
true
false6. Null
表示「值不存在」。写作小写 null。
nullJSON 文件是什么?(以及 .json 文件格式)
一份 JSON 文件(有时被打成 jason file)是一个包含单个 JSON 值的纯文本文件 —— 最常见的是对象或数组。.json 文件格式就是符合 RFC 8259 的 UTF-8 文本,按约定使用 .json 扩展名。既然是纯文本,就不需要专门的查看器。
如何打开 JSON(或 .json)文件:任何文本编辑器都行 —— VS Code、Notepad、TextEdit、Sublime、nano。同一个问题有很多种问法 —— how to open json files、how to open a .json file、how do i open a json file、how do you open a json file、或简单的 open json file —— 答案都一样:当作文本打开。想要更可读的视图,把内容贴进 JSON 查看器 看可折叠的树,或贴进 JSON Fix 工具来格式化。在 macOS 和 Windows 上,双击 .json 文件通常会用默认文本编辑器打开;如果它尝试在浏览器中打开,可以右键选「打开方式」选择一个编辑器。不需要任何解压步骤 —— .json 文件不是归档。
如何创建 JSON 文件(也常被问为「how to make a json file」):打开任何文本编辑器,写一个合法的 JSON 值(对象、数组、字符串、数字、布尔或 null),并以 .json 扩展名保存。整个过程就这样 —— 没有头部、没有 schema 声明、除了 UTF-8 之外没有任何强制编码标记。程序一识别到该扩展名,就会按 JSON 文件格式读取。一个小的 json file example:{ "name": "Ada", "active": true }。
JSON 格式是什么?(以及相关搜索 why files are stored in json format):JSON 格式是一种小型、与语言无关的文本格式,用来表示键、值、数组与对象,并带有一组固定的字面类型。文件采用这种格式存储,是因为同一份文档可以被 Python、Go、Java、JavaScript、Rust 与数据库无翻译地读取 —— JSON 是在系统之间搬运结构化数据的最大公约数。
// users.json
[
{ "id": 1, "name": "Alice", "role": "admin" },
{ "id": 2, "name": "Bob", "role": "editor" }
]你大概已经见过的常见 JSON 文件:
package.json—— Node.js 项目的元数据与依赖tsconfig.json—— TypeScript 编译器配置settings.json—— VS Code 用户设置manifest.json—— 浏览器扩展或 PWA 的 manifest
JSON 数据格式是什么?
JSON 数据格式有一些严格规则,将它与看起来相似的 JavaScript 代码区分开:
- 所有键必须是双引号字符串。
{ name: "Alice" }是 JavaScript 对象字面值,不是 JSON。 - 字符串必须使用双引号。
{ "name": 'Alice' }是不合法的 JSON。 - 不能有尾随逗号。
{ "a": 1, }是不合法的 JSON。 - 不允许注释。
// comment和/* block comment */在 JSON 中都不允许。 - 不允许
undefined。 JavaScript 的undefined在 JSON 中没有对应物。请改用null。
JSON vs. XML:JSON 为什么赢了
JSON 与 XML 是同一回事吗?不是 —— 两者都承载结构化数据,但形态、体积与机械都不同。在 JSON 接管之前,XML 是标准的数据交换格式。同一份数据两种写法:
<!-- XML -->
<user>
<name>Alice</name>
<age>30</age>
</user>
// JSON
{ "name": "Alice", "age": 30 }JSON 更紧凑、更易人读、在 JavaScript 中原生可解析无需第三方库。对大多数使用场景 —— API 响应、配置、消息传递 —— JSON 比 XML 显著节省带宽和代码量。
JSON 用在哪里
- REST API:
Content-Type: application/json头几乎标记了每一个现代 Web API 响应。 - 配置文件:
package.json、tsconfig.json、.eslintrc.json、AWS CloudFormation 模板。 - 数据库: PostgreSQL、MySQL、MongoDB、DynamoDB 都原生支持存储与查询 JSON 列或文档。
- 日志文件: 结构化日志(用 JSON Lines)让日志数据可被 Elasticsearch 等聚合工具机器解析。
- 进程间通信: 微服务、消息队列(Kafka、RabbitMQ)、无服务器函数都把 JSON 作为默认载荷格式。
数据库中的 JSON
大多数现代数据库都能直接存储和查询 JSON,因此文档不必住进单独的文档数据库就能保留结构:
- PostgreSQL —— 两种类型:
json存原文;jsonb存二进制、可索引的表示。用->/->>查字段、用@>判包含;用 GIN 索引在jsonb列上为热路径建索引。 - MongoDB —— 文档本来就是类似 JSON 的(磁盘上是 BSON)。字段级索引与完整的聚合管道都直接作用于文档形态。
- SQLite —— JSON1 扩展(现代 SQLite 已内建)提供了
json_extract、json_each,以及在 JSON 字段上索引的生成列。 - MySQL —— 原生
JSON列类型,加上路径表达式与JSON_TABLE用于把 JSON 值当作行连接。
两条实用提示对它们都适用:大整数经过客户端驱动可能丢精度;JSON 规范没有定义键的规范顺序 —— 如果你需要确定性比较或哈希,请用 RFC 8785(JCS)。
常见 JSON 错误
即使是经验丰富的开发者也会写出不合法的 JSON。最常见的错误:
- 最后一个元素后多出的尾随逗号
- 把双引号写成单引号
- 未加引号的键
- JSON 中夹杂 JavaScript 注释
- Python 风格的值,如
True、False、None
如果你的 JSON 解析不了,在线即时修复 —— 该工具会自动修复这些常见问题,并明确告诉你改了什么。
在代码中解析 JSON
每种主流语言都内建了 JSON 支持:
// JavaScript
const obj = JSON.parse('{"name":"Alice","age":30}');
console.log(obj.name); // "Alice"
# Python
import json
obj = json.loads('{"name":"Alice","age":30}')
print(obj['name']) # Alice
# Go
import "encoding/json"
var obj map[string]interface{}
json.Unmarshal([]byte(`{"name":"Alice","age":30}`), &obj)Python 里如何读取 JSON 文件(或 read json file in python):传文件路径用 json.load(open('data.json')),已经是字符串就用 json.loads(text)。两者在遇到语法错误时都会抛出 json.JSONDecodeError。
在现代系统里选择 JSON 而非 XML,通常归结为网络字节数与解析器支持 —— 每种语言都原生支持 JSON,而 XML 一般还需要第三方库。
你会遇到的常见 JSON 变体
严格 JSON 是基准线,但几个密切相关的方言会经常出现:
- JSONC(带注释的 JSON) —— 允许
//与/* */注释以及尾随逗号的 JSON。tsconfig.json和 VS Code 的settings.json都在用。标准解析器会拒绝它;请使用支持 JSONC 的解析器,或先剥掉注释。 - NDJSON / JSON Lines —— 每行一个 JSON 值,行间以
\n分隔。用于流式日志、机器学习数据集与批量 API。请用JSON.parse逐行解析,而不是一次解析整份文件。 - JSON Pointer(RFC 6901)—— 用来定位文档内部某个值的路径语法,例如
/users/0/name。JSON Patch 与 JSON Schema 的$ref用的就是这种路径格式。
常见问题
JSON 是什么的缩写?
JSON 是 JavaScript Object Notation 的缩写。尽管名字这么写,它其实与语言无关 —— 每种主流语言都能读写它 —— 由 RFC 8259 与 ECMA-404 定义。
JSON 里的数据类型有哪些?
六种:字符串、数字、布尔、null、对象与数组。没有单独的整数类型,没有日期类型,也没有 undefined。每种类型的实际例子见 JSON 格式化示例。
JSON 和 JavaScript 对象是同一个东西吗?
不是。JSON 是一种有严格规则的文本格式(双引号键、不允许尾随逗号、不允许注释);JavaScript 对象字面值是代码,宽松得多。见 JSON vs JavaScript 对象。
怎样确认 JSON 合法?
用 JSON.parse() 解析它(无效输入会抛错),或者跟着 如何校验 JSON 一步步做,并送进 校验工具。要强制结构与类型,请用 JSON Schema 描述它。
处理 JSON 的工具
- JSON Fix —— 即时校验、修复并格式化无效 JSON
- 什么是 JSON Schema? —— 描述并校验 JSON 数据的结构
- 如何格式化 JSON —— 在 JavaScript、Python、命令行或浏览器中美化 JSON
- JSON 格式化示例 —— 覆盖每种数据类型与真实场景的可复制示例
- JSON Diff —— 比较两份 JSON 文档并查看差异
- YAML 转 JSON —— 把 YAML 配置转换为 JSON 格式