← 全部文章

什么是 JSON?JSON 格式、语法与文件的完整指南

JSON(JavaScript Object Notation)是通用的数据交换格式。学习它的六种数据类型、让 JSON 严格的语法规则、.json 文件的用途,以及如何在各种语言中解析 JSON。

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。不带引号、不支持十六进制字面值、也没有 NaNInfinity

42
3.14
-7
1.5e10

5. 布尔(Boolean)

只有小写的 truefalse。JSON 不接受 TrueFalseyesno10 作为布尔值。

true
false

6. Null

表示「值不存在」。写作小写 null

null

JSON 文件是什么?(以及 .json 文件格式)

一份 JSON 文件(有时被打成 jason file)是一个包含单个 JSON 值的纯文本文件 —— 最常见的是对象或数组。.json 文件格式就是符合 RFC 8259 的 UTF-8 文本,按约定使用 .json 扩展名。既然是纯文本,就不需要专门的查看器。

如何打开 JSON(或 .json)文件:任何文本编辑器都行 —— VS Code、Notepad、TextEdit、Sublime、nano。同一个问题有很多种问法 —— how to open json fileshow to open a .json filehow do i open a json filehow 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_extractjson_each,以及在 JSON 字段上索引的生成列。
  • MySQL —— 原生 JSON 列类型,加上路径表达式与 JSON_TABLE 用于把 JSON 值当作行连接。

两条实用提示对它们都适用:大整数经过客户端驱动可能丢精度;JSON 规范没有定义键的规范顺序 —— 如果你需要确定性比较或哈希,请用 RFC 8785(JCS)

常见 JSON 错误

即使是经验丰富的开发者也会写出不合法的 JSON。最常见的错误:

  • 最后一个元素后多出的尾随逗号
  • 把双引号写成单引号
  • 未加引号的键
  • JSON 中夹杂 JavaScript 注释
  • Python 风格的值,如 TrueFalseNone

如果你的 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 PointerRFC 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 的工具