Full JSON 语法分析
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,其完整语法简洁、可读性强且易于机器解析和生成。Full JSON 语法指的是 JSON 格式的完整结构和所有规则,下面将详细解析:
一、JSON 的基本结构
JSON 数据有两种基本结构,这两种结构可以嵌套组合形成复杂数据:
-
对象(Object)
- 由花括号
{}
包裹 - 包含键值对(key-value pairs)
- 键值对之间用逗号
,
分隔 - 语法:
{ key1: value1, key2: value2, ... }
- 由花括号
-
数组(Array)
- 由方括号
[]
包裹 - 包含有序的值列表
- 值之间用逗号
,
分隔 - 语法:
[ value1, value2, ... ]
- 由方括号
二、JSON 的值(Value)类型
JSON 中的值可以是以下类型之一:
-
字符串(String)
- 必须用双引号
"
包裹(不能用单引号) - 可以包含 Unicode 字符
- 支持转义字符,包括:
\"
:双引号\\
:反斜杠/
:正斜杠\b
:退格\f
:换页\n
:换行\r
:回车\t
:制表符- Unicode 转义:
\uXXXX
(XXXX 为四位十六进制数)
- 示例:
"hello world"
、"中文测试"
、"line1\nline2"
- 必须用双引号
-
数字(Number)
- 可以是整数或浮点数
- 支持负数
- 可以使用科学计数法(如
1e3
、2.5e-2
) - 不支持八进制和十六进制表示
- 示例:
42
、-3.14
、1e+10
、2.5E-3
-
布尔值(Boolean)
- 只有两个可能的值:
true
或false
(必须小写) - 示例:
true
、false
- 只有两个可能的值:
-
空值(Null)
- 表示空值,使用
null
(必须小写) - 示例:
null
- 表示空值,使用
-
对象(Object)
- 如前文所述,嵌套的对象结构
- 示例:
{ "name": "John", "age": 30 }
-
数组(Array)
- 如前文所述,嵌套的数组结构
- 示例:
[1, 2, 3]
、["a", "b", "c"]
三、JSON 键(Key)的规则
- 必须是字符串类型,并用双引号包裹
- 键名可以包含字母、数字、下划线和美元符号
- 不能使用保留字(虽然 JSON 标准未明确禁止,但建议避免)
- 键名在同一个对象中必须唯一
- 示例:
"name"
、"user_123"
、"$id"
四、语法约束与注意事项
-
逗号规则
- 最后一个元素或键值对后不能有 trailing comma( trailing comma 指末尾多余的逗号)
- 错误示例:
[1, 2, 3, ]
、{ "a": 1, "b": 2, }
-
注释
- JSON 标准不支持注释,任何注释都会导致解析错误
- 某些实现(如 JSON5)扩展支持注释,但这不是标准 JSON
-
大小写敏感
true
、false
、null
必须小写- 键名和字符串区分大小写
-
根元素
- JSON 文本的根元素必须是一个对象或一个数组
- 不能直接是字符串、数字等基本类型(尽管某些解析器支持,但不符合标准)
-
编码
- JSON 数据通常使用 UTF-8 编码
- 标准也支持 UTF-16 和 UTF-32
五、完整示例
以下是一个包含多种 JSON 元素的完整示例:
{
"name": "Alice",
"age": 28,
"isStudent": false,
"address": {
"street": "123 Main St",
"city": "New York"
},
"hobbies": ["reading", "hiking", "coding"],
"scores": [90.5, 85, null],
"metadata": {
"createdAt": "2023-01-01T12:00:00Z",
"tags": ["user", "active"]
}
}
六、JSON 与 JavaScript 的区别
虽然 JSON 源自 JavaScript,但两者存在重要区别:
- JSON 中的键必须用双引号包裹,JavaScript 对象字面量中可以省略
- JSON 不支持函数、日期对象等 JavaScript 特定类型
- JSON 不允许 trailing comma,JavaScript 中允许
- JSON 字符串只能用双引号,JavaScript 中可以用单引号或双引号
七、总结
Full JSON 语法定义了一套严格而简洁的规则,包括对象、数组两种基本结构,以及字符串、数字、布尔值、null 四种基本值类型,支持嵌套结构。理解这些完整规则对于正确生成和解析 JSON 数据至关重要,尤其要注意与 JavaScript 对象字面量的区别以及标准中不支持的特性(如注释)。
JSON 的广泛应用使其成为现代 Web 开发、API 设计和数据交换的事实标准,掌握其完整语法是开发者的基本技能。
Full JSON 语法指的是 JSON(JavaScript Object Notation)的完整结构和规则。JSON 是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它基于两种结构:
-
对象:一个无序的键值对集合。在 JSON 中,对象以花括号
{}
表示,每个键值对由键(字符串)和值组成,用冒号:
分隔,多个键值对之间用逗号,
分隔。例如:{ "name": "John", "age": 30, "city": "New York" }
-
数组:一个有序的值列表。在 JSON 中,数组以方括号
[]
表示,值可以是任意类型(如字符串、数字、对象或数组),多个值之间用逗号,
分隔。例如:["apple", "banana", "cherry"]
JSON 还支持多种数据类型,包括:
- 字符串:用双引号
"
包围的 Unicode 字符序列。例如:"hello"
- 数字:可以是整数或浮点数。例如:
123
或45.67
- 布尔值:
true
或false
- null:表示空值或不存在的值
此外,JSON 还支持嵌套结构,即对象可以包含数组,数组也可以包含对象。例如:
{
"person": {
"name": "John",
"age": 30,
"children": [
{
"name": "Jane",
"age": 10
},
{
"name": "Doe",
"age": 8
}
]
}
}
The full JSON syntax is as follows:
JSON = null
or true or false
or JSONNumber
or JSONString
or JSONObject
or JSONArray
JSONNumber = - PositiveNumber
or PositiveNumber
PositiveNumber = DecimalNumber
or DecimalNumber . Digits
or DecimalNumber . Digits ExponentPart
or DecimalNumber ExponentPart
DecimalNumber = 0
or OneToNine Digits
ExponentPart = e Exponent
or E Exponent
Exponent = Digits
or + Digits
or - Digits
Digits = Digit
or Digits Digit
Digit = 0 through 9
OneToNine = 1 through 9
JSONString = “”
or " StringCharacters "
StringCharacters = StringCharacter
or StringCharacters StringCharacter
StringCharacter = any character
except " or \ or U+0000 through U+001F
or EscapeSequence
EscapeSequence = " or / or \ or \b or \f or \n or \r or \t
or \u HexDigit HexDigit HexDigit HexDigit
HexDigit = 0 through 9
or A through F
or a through f
JSONObject = { }
or { Members }
Members = JSONString : JSON
or Members , JSONString : JSON
JSONArray = [ ]
or [ ArrayElements ]
ArrayElements = JSON
or ArrayElements , JSON
Insignificant whitespace may be present anywhere except within a JSONNumber (numbers must contain no whitespace) or JSONString (where it is interpreted as the corresponding character in the string, or would cause an error). The tab character (U+0009), carriage return (U+000D), line feed (U+000A), and space (U+0020) characters are the only valid whitespace characters.
JSON(JavaScript Object Notation)与 XML(eXtensible Markup Language)相比,具有以下几方面的优势:
-
简洁性和可读性:
- JSON 的格式更加简洁和直观,数据以键值对的形式表示,易于阅读和理解。例如:
{"name": "John", "age": 30}
。 - 相比之下,XML 使用标签来标记数据,结构相对复杂,如
<name>John</name><age>30</age>
。
- JSON 的格式更加简洁和直观,数据以键值对的形式表示,易于阅读和理解。例如:
-
数据传输效率:
- JSON 通常比 XML 更轻量级,因为 JSON 不需要结束标签,减少了冗余字符,从而在网络传输中占用更少的带宽。
- XML 需要完整的开始和结束标签,这增加了文件的大小和解析时间。
-
解析速度:
- JSON 的解析速度通常比 XML 快,因为 JSON 的结构更简单,解析器可以更快地处理数据。
- XML 的解析过程相对复杂,需要更多的计算资源。
-
易用性:
- JSON 可以直接在 JavaScript 中使用,无需额外的解析步骤,这使得它在 Web 开发中非常受欢迎。
- XML 虽然也可以在 JavaScript 中使用,但需要通过 DOM 或 SAX 等技术进行解析,使用起来相对繁琐。
-
工具支持:
- 现代编程语言和框架对 JSON 的支持更加广泛和友好,很多语言内置了 JSON 的序列化和反序列化功能。
- 尽管 XML 也有广泛的工具支持,但在一些新兴语言和框架中,JSON 的支持更为普遍。
-
人类可读性:
- JSON 的数据格式更接近于编程中的字典或对象,对于开发者来说更容易理解和操作。
- XML 虽然也具有良好的可读性,但其标签结构和属性使得数据表示不如 JSON 直观。