JSON的基本结构:数据交换的基石
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于人阅读和编写、也易于机器解析和生成,成为现代软件开发中数据传输的“通用语言”,无论是Web API的响应、配置文件的存储,还是跨系统数据交互,JSON都扮演着核心角色,要JSON,首先需要理解其基本结构——它像一套“积木规则”,定义了数据如何被组织成有序、可扩展的格式。
JSON的核心构成:两种基础结构
JSON的基本结构只有两种:对象(Object)和数组(Array),所有复杂的JSON数据都是这两种结构的嵌套组合。
对象(Object):键值对的集合
对象是JSON中最常用的结构,用于表示“无序的键值对集合”,它类似于编程语言中的字典(Python)、哈希表(Java)或对象(JavaScript),通过“键”唯一标识“值”,实现数据的结构化存储。
-
语法规则:
- 用花括号 包裹整个对象;
- 内部由多个“键值对”组成,键值对之间用逗号 分隔;
- 每个键值对由“键(Key)”和“值(Value)”组成,用冒号 分隔;
- 键必须是字符串(需用双引号 包围,不能用单引号);
- 值可以是多种数据类型(见下文“值的类型”)。
-
示例:
一个表示用户信息的JSON对象:{ "name": "张三", "age": 28, "isStudent": false, "address": { "city": "北京", "district": "海淀区" } }这里,
"name""age""isStudent""address"是键,对应的值分别是字符串、数字、布尔值,以及另一个嵌套的对象。
数组(Array):有序的值列表
数组是JSON中另一种基础结构,用于表示“有序的值集合”,它类似于编程语言中的列表(Python)、数组(Java)或数组(JavaScript),通过索引(从0开始)访问元素,适合存储一组有序数据(如列表、时间序列等)。
-
语法规则:
- 用方括号
[]包裹整个数组; - 内部由多个“值(Value)”组成,值之间用逗号 分隔;
- 值可以是多种数据类型(包括对象、数组,实现嵌套);
- 数组中的值可以有重复,且顺序有意义。
- 用方括号
-
示例:
一个表示用户兴趣爱好的JSON数组:[ "阅读", "旅行", "编程", "摄影" ]
如果数组中的元素是对象,可以表示更复杂的数据,例如多个用户的列表:
[ { "name": "张三", "age": 28 }, { "name": "李四", "age": 25 } ]
值的类型:JSON能存储哪些数据?
无论是对象中的“值”,还是数组中的“元素”,JSON支持的数据类型(称为“JSON值”)有以下几种,基本覆盖了大多数编程语言的基础数据类型:
字符串(String)
- 表示:用双引号 包围的字符序列,不能使用单引号()。
- 支持转义字符:如
\n(换行)、\t(制表符)、\"(双引号)、\\(反斜杠)等。 - 示例:
"Hello, JSON!""北京市海淀区"
数字(Number)
- 表示:无需引号,直接书写,支持整数、小数(浮点数),以及科学计数法(如
5e3表示 1500)。 - 规则:
- 不区分整数和小数,统一视为Number类型;
- 不支持八进制(如
012)或十六进制(如0x1F)直接表示,但可以用科学计数法; - 特殊值:
Infinity(正无穷)、-Infinity(负无穷)、NaN(非数字)需用字符串表示(如 ),但实际解析时通常会被转换为对应的语言类型(如JavaScript中"Infinity"解析为Infinity)。
- 示例:
100-3.1402e23
布尔值(Boolean)
- 表示:仅两个值,
true(真)或false(假),全小写,无需引号。 - 示例:
isStudent: false
null(空值)
- 表示:表示“空”或“无值”,关键字为
null(全小写),无需引号。 - 示例:
"phone": null(表示用户未填写手机号)
复合类型:对象和数组
对象和数组本身也可以作为“值”,嵌套在其他对象或数组中,这是JSON实现复杂数据结构的关键。
{
"user": {
"name": "张三",
"hobbies": [ "阅读", "编程" ]
},
"orders": [
{ "id": 1, "product": "JSON教程" },
{ "id": 2, "product": "编程实战" }
]
}
这里,user 的值是对象,hobbies 的值是数组;orders 的值是数组,其元素又是对象——通过多层嵌套,JSON可以表示任意复杂度的数据。
JSON基本结构的核心规则
无论是简单还是复杂的JSON数据,都需遵循以下核心语法规则,这些规则是解析和生成JSON的基础:
严格的大小写敏感
JSON中的键、字符串值、关键字(如true false null)都是大小写敏感的。"Name" 和 "name" 是两个不同的键;True(大写T)不是有效的布尔值,必须写作 true。
逗号分隔,末尾无逗号
- 对象中的键值对、数组中的元素之间必须用逗号 分隔;
- 禁止在最后一个键值对或元素后加逗号(即“ trailing comma ”),这是JSON与某些编程语言(如JavaScript)的区别。
- 正确:
{ "name": "张三", "age": 28 } - 错误:
{ "name": "张三", "age": 28, }
- 正确:
引号规范:键必须用双引号
- 对象中的键必须是字符串,且必须用双引号 包围,不能用单引号 或不加引号。
- 正确:
{ "name": "张三" } - 错误:
{ 'name': "张三" }或{ name: "张三" }
- 正确:
值的灵活性:类型自由但需合法
JSON的值可以是上述6种类型中的任意一种,但必须符合对应类型的语法规范(如字符串加双引号、布尔值全小写等)。
- 正确:
{ "age": 28 }(数字)、{ "isAdult": true }(布尔值) - 错误:
{ "age": "28" }(如果数字被误写为字符串,虽然语法正确,但数据类型错误,可能导致解析后的逻辑问题)
示例:从简单到复杂的JSON结构
通过组合对象和数组,我们可以构建满足不同需求的JSON数据,以下是一个完整的示例,展示JSON如何表示一个复杂的“用户订单系统”数据:
{
"userId": 1001,
"username": "张三",
"isActive": true,
"contacts": {
"email": "zhangsan@example.com",
"phones": [ "13812345678", "13987654321" ]
},
"orders": [
{
"orderId": "A001",
"orderDate": "2023-10-01",
"products": [
{ "name": "JSON入门指南", "price": 49.9, "quantity": 1 },
{ "name": "编程思维训练", "price": 69.0, "quantity": 2 }
],
"isDelivered": true
},
{
"orderId": "A002",
"orderDate": "2023-10-05",
"products": [
{


还没有评论,来说两句吧...