JSON数据格式是什么样的?—— 轻量级数据交换格式的全解析
在当今的软件开发领域,数据交换是连接不同系统、不同语言的核心环节,而在众多数据格式中,JSON(JavaScript Object Notation,JavaScript对象表示法)凭借其简洁、易读、易解析的特性,已成为前后端交互、API接口配置、数据存储等场景的“通用语言”,JSON数据格式究竟是什么样的?它有哪些核心特点?如何正确使用?本文将为你一一拆解。
JSON的本质:用“键值对”描述数据的“结构化文本”
首先要明确:JSON是一种文本格式,它的本质是结构化数据的字符串表示,它不像二进制格式(如Protocol Buffers)那样需要特殊工具解析,而是可以直接被人类阅读,也能被任何编程语言轻松转换为原生数据类型(如Python的字典、JavaScript的对象、Java的Map等)。
JSON的核心结构:两种最基础的“容器”
JSON数据只有两种基础结构,所有复杂的JSON数据都是这两种结构的嵌套组合:
对象(Object):用“花括号”包裹的“键值对集合”
对象是JSON中最常用的结构,它表示一组无序的键值对(Key-Value Pair),类似于Python中的字典、JavaScript中的对象、Java中的HashMap。
-
语法规则:
- 用 包裹整体;
- 键和值之间用 分隔;
- 键值对之间用 分隔;
- 键必须是字符串(必须用双引号 包裹,不能用单引号);
- 值可以是多种类型(见下文“值的类型”)。
-
示例:
{ "name": "张三", "age": 25, "isStudent": false, "address": { "city": "北京", "district": "海淀区" } }这里,
"name"、"age"、"isStudent"、"address"是键,对应的值分别是字符串、数字、布尔值、另一个对象。
数组(Array):用“方括号”包裹的“有序值列表”
数组表示一组有序的值集合,类似于Python中的列表、JavaScript中的数组、Java中的ArrayList。
-
语法规则:
- 用
[]包裹整体; - 值之间用 分隔;
- 值可以是多种类型(包括对象、数组,支持嵌套)。
- 用
-
示例:
[ "苹果", "香蕉", "橙子" ]
更复杂的嵌套数组示例(存储多个用户信息):
[ { "id": 1, "name": "张三", "hobbies": ["篮球", "编程"] }, { "id": 2, "name": "李四", "hobbies": ["绘画", "音乐"] } ]
JSON值的类型:支持哪些“数据类型”?
JSON中的值(Value)可以是以下几种基本类型,也可以是对象/数组(即“复合类型”):
| 类型 | 示例 | 说明 |
|---|---|---|
| 字符串(String) | "Hello, JSON" |
必须用双引号 包裹,不能单引号;支持转义字符(如 \n、\t、\")。 |
| 数字(Number) | 25、14、-10 |
不区分整数和浮点数;不支持八进制、十六进制(如 012、0xFF 无效)。 |
| 布尔值(Boolean) | true、false |
全小写,不能大写(如 True、FALSE 无效)。 |
| 空值(Null) | null |
表示“空”或“无”,类似于Python的 None、Java的 null。 |
| 对象(Object) | 见上文“对象示例” | 键值对的嵌套结构。 |
| 数组(Array) | 见上文“数组示例” | 值的有序嵌套结构。 |
JSON的语法规则:这些“雷区”不能踩!
虽然JSON很简单,但语法要求非常严格,稍不注意就会导致解析失败,以下是必须遵守的核心规则:
键必须是“双引号字符串”
对象的键必须用双引号 包裹,单引号是无效的。
❌ 错误示例:{ 'name': '张三' }
✅ 正确示例:{ "name": "张三" }
值的类型必须匹配
- 字符串必须用双引号,数字不能加引号(否则会被当成字符串);
- 布尔值必须是
true/false(全小写),不能是TRUE/False; null必须是小写,不能是NULL或Null。
❌ 错误示例:{ "age": "25" }(数字被写成字符串)、{ "isActive": True }(布尔值大写)
✅ 正确示例:{ "age": 25 }、{ "isActive": true }
不能有注释
JSON标准不支持注释(如 或 ),因为注释会破坏数据的结构化解析,如果需要注释,可以在JSON外部用语言特定方式处理(如Python的字典注释、JavaScript的配置文件用JSON5)。
❌ 错误示例:{ "name": "张三", // 用户名 "age": 25 }
✅ 正确做法:注释写在JSON字符串外部,如Python中:
# 用户信息
user_data = '{ "name": "张三", "age": 25 }'
末尾不能有逗号
对象或数组的最后一个键值对/元素不能加逗号 ,否则会导致解析错误(部分宽松解析器可能支持,但不符合标准)。
❌ 错误示例:{ "name": "张三", "age": 25, }、[ "苹果", "香蕉", ]
✅ 正确示例:{ "name": "张三", "age": 25 }、[ "苹果", "香蕉" ]
必须使用UTF-8编码
JSON文本必须使用UTF-8编码(无BOM),以确保多语言字符(如中文、emoji)能正确显示。
JSON的示例:从简单到复杂
通过一个完整的示例,感受JSON如何通过嵌套结构描述复杂数据:
{
"school": "XX大学",
"students": [
{
"id": 1001,
"name": "王小明",
"gender": "男",
"courses": [
{ "courseName": "高等数学", "score": 92 },
{ "courseName": "大学英语", "score": 88 }
],
"contact": {
"email": "wangxm@example.com",
"phone": "13812345678"
}
},
{
"id": 1002,
"name": "李小红",
"gender": "女",
"courses": [
{ "courseName": "计算机基础", "score": 95 }
],
"contact": {
"email": "lixh@example.com",
"phone": null
}
}
],
"createTime": "2023-09-01T08:00:00Z",
"isActive": true
}
这个JSON包含:
- 顶层对象(学校信息);
- 数组(学生列表);
- 嵌套对象(学生个人信息、联系方式、课程信息);
- 多种值类型(字符串、数字、布尔值、数组、对象、null)。
JSON vs XML:为什么JSON更受欢迎?
早期,XML(可扩展标记语言)是主流的数据交换格式,但JSON凭借以下优势逐渐取代XML:
| 特点 | JSON | XML |
|---|---|---|
| 可读性 | 更简洁(无结束标签、少冗余) | 冗余(需开始/结束标签) |
| 解析效率 | 更高(直接转换为语言原生对象) | 较低(需DOM/SAX解析) |
| 数据类型 | 原生支持数字、布尔值、null | 所有数据均需文本表示 |
| 支持语言 | 所有语言原生支持 |



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