JSON,JavaScript Object Notation,是一种用于表示结构化数据的文本格式: 对象、列表、字符串、数字、布尔值和一个空值,其语法简洁到一个下午就能读完, 同时又足够严格,使得每种语言都能以相同的方式解析它。尽管名字里有 JavaScript, 但它并不依赖于 JavaScript。每种主流语言都在标准库中附带 JSON 解析器,或者 只需一行命令即可安装,这才是它获胜的真正原因:不是因为它优雅,而是因为它 简单且可移植。
它看起来像什么
{
"name": "Ada Lovelace",
"age": 36,
"isEmployed": true,
"skills": ["mathematics", "writing"],
"address": { "city": "London", "country": "UK" },
"nickname": null
}
对象是 { },保存键值对;数组是 [ ],保存有序列表;其他所有内容都嵌套在这
两个容器内。这就是 JSON 的全部结构:两种容器类型,以及它们内部的少量值类型。
六种值类型,不多不少
JSON 值是字符串、数字、布尔值(true 或 false)、null、数组或对象。
规范中不存在其他类型。没有日期类型,没有 undefined,没有注释语法,也没有
表示函数的方式。日期变成双方约定格式(通常是 ISO 8601)的字符串,而 JavaScript
中为 undefined 的值则直接不写入对象。JSON 数据类型详解
更详细地介绍了这六种类型,包括会让简单解析器出错的边缘情况。
为什么它在大多数 API 中取代了 XML
XML 用开始和结束标签包裹每个值,还支持属性,并且需要单独的模式语言来 描述什么是有效的。JSON 的容器各只有两个字符,值带有类型但不需要标签 告诉你,文档的形状反映了程序实际使用的数据结构;将 JSON 文档解析为 语言的原生对象字面量几乎是直接复制,而 XML 文档通常需要在其之上翻译 自己的对象模型。这是有效载荷大小和解析成本上的真实、可衡量的差异, 这就是为什么 REST API 在 JSON 出现后就选择了它。参见 JSON vs XML 进行更详细、更具体的比较。
你实际会遇到它的地方
- REST API 响应和请求。
Content-Type: application/json请求体的主流格式, 双向都是。 - 配置文件。
package.json、tsconfig.json以及大多数现代工具配置, 不过 YAML 在这里也很常见;参见 JSON vs YAML 了解各自适用的场景。 - NoSQL 和文档数据库。 MongoDB 文档以 BSON(JSON 的二进制超集)存储, 大多数文档存储直接接受和返回 JSON。
- 日志行和数据管道,每行一个 JSON 对象,这种格式通常称为 NDJSON。 常见 JSON 用例 介绍了这个以及其他格式。
- 浏览器存储。
localStorage只存储字符串,所以任何结构化数据 进入时用JSON.stringify,取出时用JSON.parse。
使用它
将文档粘贴到 JSON 格式化工具 中进行美化打印, 或使用 JSON 验证器 根据规范检查,它会显示 出错字符的行号和列号。两者都不会上传你粘贴的内容;两者都完全在浏览器中 运行。一旦掌握了基础,JSON 速查表 是上述语法规则的 一页参考,值得在标签页中保持打开或下载离线使用。