目录

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. 大小写敏感:仅支持全小写的truefalsenullTrueFALSENULLUndefined均为非法值。
  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合法)
    • 禁止八进制/十六进制字面量(如0o770x1A非法)
    • 禁止NaNInfinity-Infinity(会被转为null或直接报错)
  • 合法示例:123-45612.34-0.561e5-3.2E-4
  • 非法示例:01230x12NaNInfinity

补充坑点:JSON数字基于IEEE 754双精度浮点数实现,超过2^53-1(9007199254740991)的大整数会出现精度丢失,建议超大数字转为字符串存储。

3. 布尔值(Boolean)

用于表达真假逻辑,仅2个合法值:

  • 合法值:true(真)、false(假),必须全小写
  • 非法值:TRUEFalsetrue/false1/0(1/0仅为数字,非布尔语义)

4. 空值(Null)

用于表达空、不存在的语义,仅1个合法值:

  • 合法值:null,必须全小写
  • 非法值:NULLNullundefined(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格式字符串
    • NaNInfinity会被转为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); // 输出:张三

六、高频语法错误与避坑指南

  1. 使用单引号:键名、字符串用单引号,是新手最高频错误,必须用双引号
  2. 添加注释:在JSON中加///* */注释,标准不支持,若需备注可新增"_comment"字段
  3. 尾随逗号:对象/数组最后一个元素末尾加逗号,绝大多数严格解析器会直接报错
  4. 关键字大小写错误True/False/NULL/undefined,均为非法值
  5. 数字格式错误:前导零、十六进制、NaNInfinity,不符合数字规范
  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。