JSON 语法规则
JSON 的六个结构字符
JSON 语法非常简单,核心只有 6 个结构字符:
| 字符 | 名称 | 用途 |
|---|---|---|
{ | 左花括号 | 开始一个对象 |
} | 右花括号 | 结束一个对象 |
[ | 左方括号 | 开始一个数组 |
] | 右方括号 | 结束一个数组 |
: | 冒号 | 分隔键和值 |
, | 逗号 | 分隔多个元素 |
记住这 6 个字符,你就掌握了 JSON 的全部"标点符号"!
空白字符
JSON 允许在任意位置插入空白字符,让代码更易读。
合法的空白字符
| 字符 | 名称 | 写法 |
|---|---|---|
| 空格 | Space | 按空格键 |
| 制表符 | Tab | 按 Tab 键 |
| 换行 | Line Feed | 按回车键 |
| 回车 | Carriage Return | Windows 换行 |
示例:紧凑 vs 格式化
紧凑写法(合法但难读):
{"company":"广州飞翔科技","employees":[{"name":"航仔","department":"技术部"},{"name":"图妹","department":"产品部"}]}
格式化写法(推荐):
{
"company": "广州飞翔科技",
"employees": [
{
"name": "航仔",
"department": "技术部"
},
{
"name": "图妹",
"department": "产品部"
}
]
}
两种写法在程序眼中完全等价,但格式化的版本人类更容易阅读。
💡 实际开发中,传输时通常用紧凑格式(省流量),编辑时用格式化格式(易阅读)。
JSON 文本的根结构
根据 RFC 8259,JSON 文本可以是以下任何一种:
| 根类型 | 示例 | 说明 |
|---|---|---|
| 对象 | {"name":"航仔"} | 最常用 |
| 数组 | ["航仔","图妹"] | 也很常用 |
| 字符串 | "飞翔科技" | 合法但较少见 |
| 数字 | 2018 | 合法但较少见 |
| 布尔值 | true | 合法但较少见 |
| null | null | 合法但较少见 |
💡 虽然规范允许任何值作为根,但实际 API 设计中,根通常是对象或数组。
常见语法错误排查
错误 1:键名不加双引号
❌ { name: "航仔" }
✅ { "name": "航仔" }
原因:JSON 的键必须是字符串,字符串必须用双引号包裹。
错误 2:使用单引号
❌ { 'name': '航仔' }
✅ { "name": "航仔" }
原因:JSON 只认双引号,不认单引号。单引号是 JavaScript 的特性,不是 JSON 的。
错误 3:末尾多余逗号
❌ { "name": "航仔", "age": 28, }
✅ { "name": "航仔", "age": 28 }
❌ ["航仔", "图妹", ]
✅ ["航仔", "图妹"]
原因:最后一个元素后面不能加逗号。这是很多新手最容易犯的错误!
错误 4:缺少逗号
❌ { "name": "航仔" "age": 28 }
✅ { "name": "航仔", "age": 28 }
❌ ["航仔" "图妹"]
✅ ["航仔", "图妹"]
原因:多个键值对或多个数组元素之间必须用逗号分隔。
错误 5:括号不匹配
❌ { "name": "航仔" ]
✅ { "name": "航仔" }
❌ [ "航仔", "图妹" }
✅ [ "航仔", "图妹" ]
原因:对象用花括号 {},数组用方括号 [],不能混用。
错误 6:数字前导零
❌ { "month": 06 }
✅ { "month": 6 }
原因:JSON 数字不允许前导零(0 本身除外)。
错误 7:注释
❌ {
// 这是公司名称
"company": "飞翔科技"
}
❌ {
/* 这是公司名称 */
"company": "飞翔科技"
}
原因:JSON 不支持任何注释!如果需要注释,可以在外部文档里写。
错误 8:undefined
❌ { "value": undefined }
✅ { "value": null }
原因:JSON 没有 undefined,用 null 代替。
JSON 校验工具
写 JSON 时,可以用在线工具检查语法是否正确:
- JSONLint (jsonlint.com) — 最经典的 JSON 校验工具
- JSON Formatter & Validator — 格式化 + 校验
- VS Code — 自带 JSON 语法检查,错误会标红
一个合法的完整 JSON 示例
{
"company": "广州飞翔科技",
"website": "www.feixiang.net",
"established": 2018,
"isActive": true,
"departments": [
{
"name": "技术部",
"headcount": 5,
"members": [
{ "name": "航仔", "position": "后端开发", "isActive": true },
{ "name": "翼王", "position": "架构师", "isActive": true },
{ "name": "凌叔", "position": "运维工程师", "isActive": true },
{ "name": "空少", "position": "前端开发", "isActive": true },
{ "name": "风速", "position": "算法工程师", "isActive": false }
]
},
{
"name": "产品部",
"headcount": 3,
"members": [
{ "name": "图妹", "position": "产品经理", "isActive": true },
{ "name": "星宇", "position": "产品助理", "isActive": true },
{ "name": "靓晴", "position": "UI设计师", "isActive": true }
]
},
{
"name": "运营部",
"headcount": 4,
"members": [
{ "name": "鸣哥", "position": "内容运营", "isActive": true },
{ "name": "雁姐", "position": "用户运营", "isActive": true },
{ "name": "波比", "position": "活动运营", "isActive": true },
{ "name": "云吞", "position": "社群运营", "isActive": true }
]
}
],
"totalEmployees": 12,
"slogan": "愿你朝华相顾,愿你前程似锦。"
}
JSON 与 JavaScript 对象的区别
很多人混淆 JSON 和 JavaScript 对象,关键区别如下:
| 特性 | JSON | JavaScript 对象 |
|---|---|---|
| 键名引号 | 必须双引号 | 可以不加引号 |
| 字符串引号 | 必须双引号 | 单双引号都可以 |
| 末尾逗号 | 不允许 | 允许 |
| 注释 | 不支持 | 支持 |
| 函数 | 不支持 | 支持 |
| undefined | 不支持 | 支持 |
| 变量 | 不支持 | 支持 |
// 这是 JavaScript 对象(不是 JSON!)
const person = {
name: '航仔', // 键没加引号
age: 28, // 数字
isActive: true, // 布尔值
hobby: undefined, // JSON 不支持
sayHi: function() {}, // JSON 不支持函数
// 这是注释,JSON 不支持
};
// 这才是 JSON 字符串
const jsonString = '{"name":"航仔","age":28,"isActive":true}';
一句话总结
提示
JSON 语法只有 6 个核心字符:{}[]:,。记住:键用双引号、逗号分隔、末尾不加逗号、不支持注释、不支持单引号!