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 数据类型详解 更详细地介绍每种类型,包括
那些会让 naive 解析器栽跟头的边缘情况。
为什么它在大多数 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 速查表 是一页的语法 规则参考,值得在标签页中打开或下载离线参考。