# Json 语法详细总结


# JSON语法详细总结
JSON（JavaScript Object Notation）是一种**轻量级、跨语言、纯文本的数据交换格式**，基于ECMAScript的对象字面量语法设计，独立于编程语言，几乎所有主流语言都提供了完善的JSON解析与生成能力，是当前前后端交互、配置文件、数据存储的主流格式。

当前JSON的官方标准为 **RFC 8259**（2017年发布，替代旧版RFC 4627），以下所有语法规则均基于该官方标准。

---

## 一、JSON核心基础语法规则
这是JSON语法的硬性约束，违反则为非法JSON，严格模式下解析器会直接抛出语法错误。
1.  **文件规范**：JSON文件扩展名为`.json`，标准MIME类型为`application/json`。
2.  **顶层值规范**：RFC 8259允许顶层为任意合法的JSON值（字符串、数字、布尔、null、对象、数组）；旧标准RFC 4627强制顶层必须为对象/数组，生产环境建议优先使用对象/数组作为顶层，保证兼容性。
3.  **键名强制规范**：对象的键名（key）**必须使用双引号包裹的字符串**，禁止无引号、单引号、反引号。
4.  **字符串规范**：所有字符串值**必须使用双引号包裹**，单引号、反引号均为非法。
5.  **大小写敏感**：仅支持全小写的`true`、`false`、`null`，`True`、`FALSE`、`NULL`、`Undefined`均为非法值。
6.  **禁止尾随逗号**：对象最后一个键值对、数组最后一个元素末尾，禁止添加多余逗号。
7.  **禁止注释**：官方标准**不支持任何形式的注释**（`//`单行注释、`/* */`多行注释），非标准宽松解析器的注释支持不具备跨环境兼容性，生产环境严禁使用。
8.  **禁止未转义控制字符**：字符串中禁止直接包含ASCII 0-31的控制字符（如换行、制表符），必须通过转义符表达。

---

## 二、JSON 6种核心数据类型
JSON仅支持6种数据类型，分为**原始值类型**和**复合结构类型**两大类，值可以无限嵌套。

### （一）原始值类型（简单值）
#### 1. 字符串（String）
用于表达文本数据，是JSON中最常用的类型之一。
- 核心语法：必须用双引号`" "`完整包裹
- 支持的转义字符（必须转义的特殊字符）：
  | 转义符 | 含义 |
  |--------|------|
  | `\"`   | 双引号（字符串内的双引号必须转义） |
  | `\\`   | 反斜杠 |
  | `\/`   | 正斜杠 |
  | `\b`   | 退格符 |
  | `\f`   | 换页符 |
  | `\n`   | 换行符 |
  | `\r`   | 回车符 |
  | `\t`   | 水平制表符 |
  | `\uXXXX` | 4位十六进制数表示的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种类型均可）
  - 键与值之间用冒号`:`分隔，键值对之间用逗号`,`分隔
  - 禁止重复键名（解析器会用后出现的键值覆盖前序，标准不推荐）
  - 禁止末尾尾随逗号
- 合法示例：
```json
{
  "name": "张三",
  "age": 25,
  "isStudent": false,
  "address": null
}
```
- 非法示例：
```json
{
  name: "张三", // 键名无引号
  'age': 25, // 键名用单引号
  "isStudent": False, // 布尔值大小写错误
  "address": null, // 尾随逗号
}
```

#### 6. 数组（Array）
用于表达有序的值集合，支持异构元素（不同类型的元素可共存）。
- 核心语法：用中括号`[ ]`包裹，内部为有序的元素列表
- 核心规则：
  - 元素可以是任意合法的JSON类型（6种类型均可）
  - 元素之间用逗号`,`分隔
  - 禁止末尾尾随逗号
  - 支持无限嵌套，可嵌套对象、数组
- 合法示例：
```json
["苹果", "香蕉", 123, true, null, {"id": 1, "name": "商品"}]
```
- 非法示例：
```json
["苹果", "香蕉", ] // 尾随逗号
```

---

## 三、JSON嵌套结构
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`
  - 循环引用的对象会直接抛出错误
- 示例：
```javascript
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、函数）：
```json
{
  "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`：可选，还原函数，用于对解析后的键值对做二次处理
- 示例：
```javascript
const jsonStr = '{"name":"张三","age":25,"isStudent":false}';
const user = JSON.parse(jsonStr);
console.log(user.name); // 输出：张三
```

---

## 六、高频语法错误与避坑指南
1.  **使用单引号**：键名、字符串用单引号，是新手最高频错误，必须用双引号
2.  **添加注释**：在JSON中加`//`或`/* */`注释，标准不支持，若需备注可新增`"_comment"`字段
3.  **尾随逗号**：对象/数组最后一个元素末尾加逗号，绝大多数严格解析器会直接报错
4.  **关键字大小写错误**：`True`/`False`/`NULL`/`undefined`，均为非法值
5.  **数字格式错误**：前导零、十六进制、`NaN`、`Infinity`，不符合数字规范
6.  **未转义特殊字符**：字符串内的双引号、反斜杠未转义，直接换行写多行字符串
7.  **大整数精度丢失**：超过安全整数范围的数字未转字符串，导致解析后数值错误
8.  **循环引用**：序列化带循环引用的JS对象，直接抛出异常

---

## 七、最佳实践
1.  严格遵循RFC 8259标准，不依赖非标准的宽松解析特性，保证跨语言、跨环境兼容性
2.  键名使用有语义的英文命名，避免中文、特殊字符，提升可读性和兼容性
3.  日期统一使用ISO 8601格式（如`"2026-04-16T00:00:00Z"`），不使用时间戳或自定义格式
4.  超大整数、唯一ID（如雪花ID）统一转为字符串存储，避免精度丢失
5.  嵌套层级控制在3-4层以内，避免过深嵌套导致的可读性和解析性能问题
6.  布尔值使用`true`/`false`表达语义，不使用`1`/`0`替代
7.  生产环境传输时压缩JSON，调试/配置场景使用格式化缩进，提升可读性

---

## 补充说明
JSON5、JSONC等是JSON的非官方扩展规范，支持注释、单引号、尾随逗号、多行字符串等特性，仅适用于特定场景（如配置文件），**不具备通用兼容性**，API接口、跨语言数据交互场景必须使用标准JSON。


