一、JSON基本结构
JSON(JavaScript Object Notation)是一种轻量级数据交换格式,由两种基础结构组成:
-
键值对集合:
{ ... }
表示对象(Object) -
有序值列表:
[ ... ]
表示数组(Array)
二、JSON数据类型
1. 对象(Object)
-
语法:
{ "key1": value1, "key2": value2 }
-
规则:
- 键名必须用双引号包裹(单引号无效)
- 键值对用冒号
:
分隔 - 多个键值对用逗号
,
分隔 - 最后一个键值对不能有尾随逗号
示例:
{
"name": "张三",
"age": 30,
"isStudent": false
}
2. 数组(Array)
-
语法:
[ value1, value2, value3 ]
-
规则:
- 值之间用逗号
,
分隔 - 最后一个元素不能有尾随逗号
- 支持嵌套(对象/数组混合)
- 值之间用逗号
示例:
["apple", "banana", { "type": "fruit" }]
3. 值(Value)
JSON值可以是以下6种类型:
-
字符串(String):
"text"
-
数字(Number):
123
、3.14
、-5e3
-
布尔值(Boolean):
true
或false
-
空值(Null):
null
- 对象(Object)
- 数组(Array)
三、字符串(String)规范
-
必须用双引号包裹:
"Hello"
-
转义字符:
转义序列 含义 \"
双引号 \\
反斜杠 \/
正斜杠 \b
退格符 \f
换页符 \n
换行符 \r
回车符 \t
制表符 \uXXXX
Unicode字符
示例:
{
"message": "Hello,\n\"World\"!",
"unicode": "\u03A9" // 表示希腊字母Ω
}
四、数字(Number)规范
-
合法格式:
- 整数:
42
- 负数:
-10
- 小数:
3.1415
- 科学计数法:
2e3
(=2000)、1.5E-4
- 整数:
-
禁止格式:
- 前导零(
0123
非法,除非是0
) - 十六进制(
0xFF
非法) - NaN/Infinity(需转为字符串表示)
- 前导零(
示例:
{ "price": 9.99, "quantity": -5, "speed": 3e8 }
五、空白字符处理
-
合法空白符:空格(
\t
)、换行符(\n
)、回车符(\r
) - 作用:用于格式化(不影响数据解析)
-
禁止位置:
- 键名内部(
" first "
非法) - 数值内部(
12 3
非法)
- 键名内部(
示例:
{
"valid": [ 1, 2 ], // 合法
"invalid": [ 1 , , 2 ] // 非法(中间多余逗号)
}
六、JSON vs JavaScript对象
虽然JSON源自JavaScript,但存在关键区别:
特性 | JSON | JavaScript对象 |
---|---|---|
键名引号 | 必须双引号 | 可省略引号 |
数值格式 | 禁止NaN/Infinity | 允许 |
注释 | 不支持 | 支持 |
尾随逗号 | 禁止 | 允许(ES5+) |
七、常见错误示例
-
键名未用双引号:
{ name: "张三" } // 错误!
-
尾随逗号:
{ "a": 1, "b": 2, } // 错误!
-
非法数值:
{ "value": NaN } // 错误!
-
注释使用:
{ /* 注释 */ "key": "value" } // 错误!
八、JSON语法验证工具
- 在线验证:https://jsonlint.com/
- IDE插件:VS Code、IntelliJ JSON支持
- 命令行工具:
jq
(Linux/Mac)
掌握这些规范可避免90%的JSON解析错误!如需深入学习,可参考 RFC 8259 官方文档。