什么是 JSON?
JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种轻量级的数据交换格式。它基于 JavaScript 的一个子集,但因其语言无关性,几乎被所有现代编程语言所支持。
JSON 的设计目标是易于人类阅读和编写,同时也易于机器解析和生成。自 2001 年由 Douglas Crockford 推广以来,JSON 已迅速取代 XML,成为互联网上最主流的数据交换格式。
JSON 的语法规则
JSON 的语法非常简单,只有六种规则:
- 数据使用 键值对(key/value)表示
- 键名必须使用双引号包裹
- 不同数据之间用逗号分隔
- 花括号
{}表示对象 - 方括号
[]表示数组 - 值可以是字符串、数字、布尔值、null、对象或数组
一个完整的 JSON 示例:
{
"name": "JSON 工具箱",
"version": "1.0.0",
"free": true,
"users": 0,
"features": ["格式化", "校验", "压缩", "对比"],
"author": null,
"metadata": {
"published": true,
"tags": ["工具", "开发", "效率"]
}
}
JSON 的数据类型详解
JSON 支持六种数据类型:
1. 字符串(String)
字符串必须用双引号包裹,支持转义字符(如 \"、\n、\\)。与 JavaScript 不同,JSON 不支持单引号或模板字符串。
{ "message": "Hello, \"世界\"!\n下一行" }
2. 数字(Number)
JSON 中的数字可以是整数或浮点数,支持科学计数法。注意:JSON 中不区分整数和浮点数,也没有 NaN 或 Infinity。
{
"integer": 42,
"float": 3.14,
"scientific": 1.5e10
}
3. 布尔值(Boolean)
只有两个值:true 和 false,且必须小写。
{ "isActive": true, "isVerified": false }
4. null
表示空值或无值,必须小写。与 undefined 不同,null 是 JSON 中表示"无"的唯一方式。
{ "middleName": null }
5. 对象(Object)
由花括号包裹的键值对集合。键必须是字符串(用双引号),值可以是任意数据类型。对象可以嵌套。
{
"user": {
"name": "Alice",
"profile": {
"age": 28,
"email": "alice@example.com"
}
}
}
6. 数组(Array)
由方括号包裹的有序列表。数组可以包含任意数据类型的值,甚至可以混合不同类型。
{
"mixed": [1, "two", true, null, { "key": "value" }],
"users": ["Alice", "Bob", "Charlie"]
}
JSON 的常见应用场景
API 数据交换
JSON 是 RESTful API 和 GraphQL 中最主流的数据格式。前端通过 HTTP 请求从后端获取 JSON 数据并渲染到页面上。
// API 响应示例
GET /api/users/1
Response:
{
"id": 1,
"name": "Alice",
"email": "alice@example.com",
"orders": [
{ "id": 1001, "total": 29.99 },
{ "id": 1002, "total": 49.99 }
]
}
配置文件
许多现代工具和框架使用 JSON 作为配置文件格式,如 package.json(npm)、tsconfig.json(TypeScript)、manifest.json(Chrome 扩展)等。
数据存储
NoSQL 数据库(如 MongoDB)直接使用类 JSON 格式(BSON)存储数据。浏览器端的 localStorage 也常使用 JSON.stringify() 和 JSON.parse() 来存取结构化数据。
前端状态管理
在 JavaScript 应用中,组件状态、Redux/Vuex 的状态树都是以 JSON 对象的形式存在和流转的。
JSON 的常见误区与规范
误区一:键名可以不加引号
在 JavaScript 中对象键可以省略引号,但在 JSON 中必须使用双引号。这是最常见的 JSON 格式错误。
// ❌ 错误
{ name: "Alice", age: 28 }
// ✅ 正确
{ "name": "Alice", "age": 28 }
误区二:可以使用注释
JSON 官方规范不支持注释。如果需要说明字段含义,可以在数据结构中加入 description 字段,或使用 JSON Schema。
误区三:最后一项可以加逗号
JSON 不允许结尾逗号(trailing comma),这与 JavaScript 不同。
// ❌ 错误
{ "a": 1, "b": 2, }
// ✅ 正确
{ "a": 1, "b": 2 }
误区四:数字可以有前导零
JSON 中的数字不允许前导零(例如 01 或 00.5 是无效的)。
JSON 与 JSON Schema
JSON Schema 是一种基于 JSON 自身格式定义的验证语言,用于描述 JSON 数据的结构和约束。它类似于 XML Schema 对 XML 的作用。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": { "type": "string", "minLength": 1 },
"age": { "type": "integer", "minimum": 0, "maximum": 150 },
"email": { "type": "string", "format": "email" }
},
"required": ["name", "email"]
}
JSON 的优缺点
优点
- 简洁轻量:语法简单,数据体积小,传输效率高
- 可读性强:结构清晰,易于人工阅读和调试
- 语言无关:几乎所有语言都有成熟的 JSON 解析库
- 解析速度快:相比 XML,JSON 的解析效率更高
- 原生支持:JavaScript 提供
JSON.parse()和JSON.stringify()原生方法
局限
- 不支持注释:不便于在文件中做说明
- 没有日期类型:日期通常用 ISO 8601 字符串表示,需要开发者自行约定
- 没有二进制类型:二进制数据需要编码为 Base64 字符串
- 不支持循环引用:无法表示图状数据结构
总结
JSON 以其极致的简洁性和广泛的兼容性,成为了当今互联网数据交换的事实标准。无论是 Web 开发、移动应用、微服务通信还是物联网设备,JSON 都在其中扮演着重要角色。
掌握 JSON 的语法规范和使用技巧,对每一位开发者来说都是基础且重要的技能。你可以使用 JSON 工具箱 来格式化、校验和处理你的 JSON 数据,提高日常开发效率。