Json 语法详细总结
JSON语法详细总结
JSON(JavaScript Object Notation)是一种轻量级、跨语言、纯文本的数据交换格式,基于ECMAScript的对象字面量语法设计,独立于编程语言,几乎所有主流语言都提供了完善的JSON解析与生成能力,是当前前后端交互、配置文件、数据存储的主流格式。
当前JSON的官方标准为 RFC 8259(2017年发布,替代旧版RFC 4627),以下所有语法规则均基于该官方标准。
一、JSON核心基础语法规则
这是JSON语法的硬性约束,违反则为非法JSON,严格模式下解析器会直接抛出语法错误。
- 文件规范:JSON文件扩展名为
.json,标准MIME类型为application/json。 - 顶层值规范:RFC 8259允许顶层为任意合法的JSON值(字符串、数字、布尔、null、对象、数组);旧标准RFC 4627强制顶层必须为对象/数组,生产环境建议优先使用对象/数组作为顶层,保证兼容性。
- 键名强制规范:对象的键名(key)必须使用双引号包裹的字符串,禁止无引号、单引号、反引号。
- 字符串规范:所有字符串值必须使用双引号包裹,单引号、反引号均为非法。
- 大小写敏感:仅支持全小写的
true、false、null,True、FALSE、NULL、Undefined均为非法值。 - 禁止尾随逗号:对象最后一个键值对、数组最后一个元素末尾,禁止添加多余逗号。
- 禁止注释:官方标准不支持任何形式的注释(
//单行注释、/* */多行注释),非标准宽松解析器的注释支持不具备跨环境兼容性,生产环境严禁使用。 - 禁止未转义控制字符:字符串中禁止直接包含ASCII 0-31的控制字符(如换行、制表符),必须通过转义符表达。
二、JSON 6种核心数据类型
JSON仅支持6种数据类型,分为原始值类型和复合结构类型两大类,值可以无限嵌套。
(一)原始值类型(简单值)
1. 字符串(String)
用于表达文本数据,是JSON中最常用的类型之一。
- 核心语法:必须用双引号
" "完整包裹 - 支持的转义字符(必须转义的特殊字符):
转义符 含义 \"双引号(字符串内的双引号必须转义) \\反斜杠 \/正斜杠 \b退格符 \f换页符 \n换行符 \r回车符 \t水平制表符 \uXXXX4位十六进制数表示的Unicode字符(如 \u4F60\u597D对应"你好") - 合法示例:
"Hello World"、"He said \"Hi!\""、"2026-04-16"、"\u4F60\u597D" - 非法示例:
'Hello'(单引号)、"He said "Hi!""(未转义双引号)、"Hello World"(直接换行,未用\n转义)
2. 数字(Number)
用于表达整数、浮点数,JSON不区分整型和浮点型,统一为Number类型。
- 核心语法:支持整数、负数、浮点数、科学计数法
- 强制约束:
- 禁止前导零(如
0123非法,0.123合法) - 禁止八进制/十六进制字面量(如
0o77、0x1A非法) - 禁止
NaN、Infinity、-Infinity(会被转为null或直接报错)
- 禁止前导零(如
- 合法示例:
123、-456、12.34、-0.56、1e5、-3.2E-4 - 非法示例:
0123、0x12、NaN、Infinity
补充坑点:JSON数字基于IEEE 754双精度浮点数实现,超过
2^53-1(9007199254740991)的大整数会出现精度丢失,建议超大数字转为字符串存储。
3. 布尔值(Boolean)
用于表达真假逻辑,仅2个合法值:
- 合法值:
true(真)、false(假),必须全小写 - 非法值:
TRUE、False、true/false、1/0(1/0仅为数字,非布尔语义)
4. 空值(Null)
用于表达空、不存在的语义,仅1个合法值:
- 合法值:
null,必须全小写 - 非法值:
NULL、Null、undefined(JSON不支持undefined类型)
(二)复合结构类型
5. 对象(Object)
JSON的核心结构,用于表达无序的键值对集合,是结构化数据的核心载体。
- 核心语法:用大括号
{ }包裹,内部为key: value格式的键值对 - 核心规则:
- 键(key)必须是双引号包裹的字符串,是唯一标识
- 值(value)可以是任意合法的JSON类型(6种类型均可)
- 键与值之间用冒号
:分隔,键值对之间用逗号,分隔 - 禁止重复键名(解析器会用后出现的键值覆盖前序,标准不推荐)
- 禁止末尾尾随逗号
- 合法示例:
{
"name": "张三",
"age": 25,
"isStudent": false,
"address": null
}- 非法示例:
{
name: "张三", // 键名无引号
'age': 25, // 键名用单引号
"isStudent": False, // 布尔值大小写错误
"address": null, // 尾随逗号
}6. 数组(Array)
用于表达有序的值集合,支持异构元素(不同类型的元素可共存)。
- 核心语法:用中括号
[ ]包裹,内部为有序的元素列表 - 核心规则:
- 元素可以是任意合法的JSON类型(6种类型均可)
- 元素之间用逗号
,分隔 - 禁止末尾尾随逗号
- 支持无限嵌套,可嵌套对象、数组
- 合法示例:
["苹果", "香蕉", 123, true, null, {"id": 1, "name": "商品"}]- 非法示例:
["苹果", "香蕉", ] // 尾随逗号三、JSON嵌套结构
JSON支持无限层级的嵌套,最常用的嵌套模式为:对象嵌套对象、对象嵌套数组、数组嵌套对象,是复杂结构化数据的标准写法。
完整合法的嵌套JSON示例
{
"userInfo": {
"userId": 1001,
"userName": "LiMing",
"isVip": false,
"registerTime": "2026-01-01T08:00:00Z",
"tags": ["student", "developer", "traveler"],
"address": {
"province": "Shanghai",
"city": "Shanghai",
"district": "Baoshan",
"detail": null
},
"orderList": [
{
"orderId": "ORD20260401001",
"amount": 299.99,
"payStatus": true,
"goodsCount": 3
},
{
"orderId": "ORD20260410002",
"amount": 129.5,
"payStatus": false,
"goodsCount": 1
}
]
},
"code": 200,
"message": "success"
}四、JSON与JavaScript对象的核心区别
很多人会混淆JSON和JS对象,二者语法相似,但本质完全不同,核心区别如下:
| 特性 | 标准JSON | JavaScript对象 |
|---|---|---|
| 键名规则 | 必须双引号包裹 | 支持无引号、单引号、双引号,支持标识符命名 |
| 字符串规则 | 仅支持双引号 | 支持单引号、双引号、反引号模板字符串 |
| 注释 | 官方标准不支持 | 支持//单行注释、/* */多行注释 |
| 尾随逗号 | 严格禁止 | ES5+支持对象/数组的尾随逗号 |
| 支持的数据类型 | 仅6种核心类型,不支持函数、undefined、Symbol、正则 | 支持所有JS原生类型,包括函数、正则、Date、Symbol等 |
| 关键字规范 | true/false/null必须全小写,不支持undefined |
关键字大小写宽松,原生支持undefined |
| 数字规范 | 禁止前导零、十六进制、NaN、Infinity | 全部支持,无强制约束 |
五、JSON序列化与反序列化(JS环境)
JavaScript提供了原生JSON全局对象,用于实现JS值与JSON字符串的互转,是前端最常用的JSON操作API,严格遵循JSON语法规范。
1. JSON.stringify():JS值 → JSON字符串
将符合规范的JS值转为标准JSON字符串,用于数据传输、存储。
- 语法:
JSON.stringify(value, replacer, space)value:必填,要转换的JS值replacer:可选,替换函数/数组,用于过滤/转换键值对space:可选,缩进空格数/字符串,用于格式化JSON,提升可读性
- 核心特性与坑点:
- 自动忽略值为
undefined、函数、Symbol的属性 Date对象会自动转为ISO 8601格式字符串NaN、Infinity会被转为null- 循环引用的对象会直接抛出错误
- 自动忽略值为
- 示例:
const user = {
name: "张三",
age: 25,
isStudent: false,
address: undefined,
sayHi: () => console.log("hi"),
registerTime: new Date("2026-01-01")
};
// 格式化输出,缩进2个空格
console.log(JSON.stringify(user, null, 2));输出结果(自动忽略undefined、函数):
{
"name": "张三",
"age": 25,
"isStudent": false,
"registerTime": "2025-12-31T16:00:00.000Z"
}2. JSON.parse():JSON字符串 → JS值
将标准JSON字符串解析为JS值,若字符串不符合JSON语法规范,会直接抛出SyntaxError。
- 语法:
JSON.parse(text, reviver)text:必填,标准JSON字符串reviver:可选,还原函数,用于对解析后的键值对做二次处理
- 示例:
const jsonStr = '{"name":"张三","age":25,"isStudent":false}';
const user = JSON.parse(jsonStr);
console.log(user.name); // 输出:张三
六、高频语法错误与避坑指南
- 使用单引号:键名、字符串用单引号,是新手最高频错误,必须用双引号
- 添加注释:在JSON中加
//或/* */注释,标准不支持,若需备注可新增"_comment"字段 - 尾随逗号:对象/数组最后一个元素末尾加逗号,绝大多数严格解析器会直接报错
- 关键字大小写错误:
True/False/NULL/undefined,均为非法值 - 数字格式错误:前导零、十六进制、
NaN、Infinity,不符合数字规范 - 未转义特殊字符:字符串内的双引号、反斜杠未转义,直接换行写多行字符串
- 大整数精度丢失:超过安全整数范围的数字未转字符串,导致解析后数值错误
- 循环引用:序列化带循环引用的JS对象,直接抛出异常
七、最佳实践
- 严格遵循RFC 8259标准,不依赖非标准的宽松解析特性,保证跨语言、跨环境兼容性
- 键名使用有语义的英文命名,避免中文、特殊字符,提升可读性和兼容性
- 日期统一使用ISO 8601格式(如
"2026-04-16T00:00:00Z"),不使用时间戳或自定义格式 - 超大整数、唯一ID(如雪花ID)统一转为字符串存储,避免精度丢失
- 嵌套层级控制在3-4层以内,避免过深嵌套导致的可读性和解析性能问题
- 布尔值使用
true/false表达语义,不使用1/0替代 - 生产环境传输时压缩JSON,调试/配置场景使用格式化缩进,提升可读性
补充说明
JSON5、JSONC等是JSON的非官方扩展规范,支持注释、单引号、尾随逗号、多行字符串等特性,仅适用于特定场景(如配置文件),不具备通用兼容性,API接口、跨语言数据交互场景必须使用标准JSON。