JSON如何传递数据类型:从基础到实践的全面解析
JSON:跨语言数据交换的“通用语”
在软件开发中,不同编程语言(如Python、Java、JavaScript、C++等)之间经常需要传递数据,由于各语言原生数据类型(如Python的字典、Java的Map)存在差异,直接传递会导致兼容性问题,JSON(JavaScript Object Notation,JavaScript对象表示法)应运而生——它是一种轻量级的数据交换格式,以文本形式存储和表示数据,具有易读、易解析、跨语言支持的特点,成为前后端交互、API接口、配置文件等场景下的“数据交换标准”。
JSON原生支持的数据类型:简洁却核心
JSON的设计目标是“最小化且通用”,因此仅支持6种基本数据类型,分为“简单类型”和“结构化类型”两大类,这些类型是JSON传递数据的基础,理解它们是JSON数据类型传递的关键。
简单数据类型(值类型)
(1)字符串(String)
- 表示形式:用双引号包裹的字符序列,如
"Hello, JSON"、"用户姓名"。 - 注意事项:
- JSON字符串必须用双引号(单引号非法),
'single quotes'是无效的JSON字符串; - 支持转义字符(如
\n换行、\t制表符、\"双引号等),"Line1\nLine2"。
- JSON字符串必须用双引号(单引号非法),
(2)数字(Number)
- 表示形式:不区分整数和浮点数,直接写数值,如
123(整数)、-45.67(负浮点数)、14e2(科学计数法,表示314)。 - 注意事项:
- 不支持八进制、十六进制(如
0123、0xFF非法); - 不支持特殊值(如
NaN、Infinity),需通过字符串模拟(如"NaN")。
- 不支持八进制、十六进制(如
(3)布尔值(Boolean)
- 表示形式:仅两个固定值——
true(真)和false(假),全小写,首字母不能大写(如True或FALSE非法)。
(4)空值(Null)
- 表示形式:
null,表示“空”或“无值”,"address": null表示地址字段为空。
结构化数据类型(复合类型)
(1)对象(Object)
- 表示形式:无序的“键值对”集合,用花括号包裹,键值对之间用逗号分隔,键和值用冒号分隔。
{ "name": "张三", "age": 25, "isStudent": false } - 注意事项:
- 键(key)必须是字符串(双引号包裹);
- 值(value)可以是任意JSON类型(包括字符串、数字、布尔值、null、对象或数组);
- 键在同一个对象内必须唯一(重复键以最后一个为准)。
(2)数组(Array)
- 表示形式:有序的值列表,用方括号
[]包裹,值之间用逗号分隔。[1, "apple", true, null, {"city": "北京"}, [10, 20]] - 注意事项:
- 数组中的值可以是任意JSON类型(支持混合类型,如上例同时包含数字、字符串、对象等);
- 数组通过索引访问(从0开始),如
[1, 2, 3][0]结果为1。
JSON如何“传递”数据类型:从序列化到反序列化
JSON传递数据类型的核心过程是序列化(Serialization)和反序列化(Deserialization):
- 序列化:将编程语言原生数据类型(如Python的字典、Java的对象)转换为JSON字符串,以便在网络中传输或存储到文件;
- 反序列化:将JSON字符串解析为编程语言原生数据类型,以便在代码中处理。
序列化:从原生类型到JSON
不同语言将原生类型转换为JSON时,需遵循“类型映射规则”,以下是常见语言的映射关系:
| 原生语言类型 | JSON类型 | 示例(Python) | JSON输出 |
|---|---|---|---|
| 字典(dict) | 对象(Object) | {"name": "李四", "age": 30} |
{"name":"李四","age":30} |
| 列表/元组(list/tuple) | 数组(Array) | [1, 2, 3] |
[1,2,3] |
| 字符串(str) | 字符串(String) | "Hello" |
"Hello" |
| 整数/浮点数(int/float) | 数字(Number) | 14 |
14 |
| 布尔值(bool) | 布尔值(Boolean) | True |
true |
| 空值(None) | 空值(Null) | None |
null |
示例(Python序列化):
使用json库将Python字典转换为JSON字符串:
import json
python_data = {
"name": "王五",
"age": 28,
"hobbies": ["阅读", "游泳"],
"address": None
}
json_str = json.dumps(python_data) # 序列化
print(json_str)
# 输出:{"name": "王五", "age": 28, "hobbies": ["阅读", "游泳"], "address": null}
反序列化:从JSON到原生类型
反序列化时,JSON类型会被“翻译”为目标语言的对应类型,映射规则与序列化相反:
| JSON类型 | 原生语言类型(Python) | 原生语言类型(Java) | 原生语言类型(JavaScript) |
|---|---|---|---|
| 对象(Object) | 字典(dict) | LinkedHashMap/POJO类 | Object/Map |
| 数组(Array) | 列表(list) | List/Array | Array |
| 字符串(String) | 字符串(str) | String | string |
| 数字(Number) | 整数(int)/浮点数(float) | int/long/double | number |
| 布尔值(Boolean) | 布尔值(bool) | boolean | boolean |
| 空值(Null) | 空值(None) | null | null |
示例(Python反序列化):
将JSON字符串解析为Python字典:
import json
json_str = '{"name": "王五", "age": 28, "hobbies": ["阅读", "游泳"], "address": null}'
python_data = json.loads(json_str) # 反序列化
print(python_data["name"]) # 输出:王五
print(python_data["hobbies"][0]) # 输出:阅读
JSON传递数据类型的注意事项与最佳实践
类型一致性:避免“隐性转换”
不同语言对JSON类型的解析可能存在细微差异,需确保发送方和接收方的类型映射一致。
- JavaScript中
JSON.parse('{"count": 1}')的count是数字,而某些弱类型语言可能将其解析为字符串; - 布尔值必须是小写
true/false,首字母大写(如True)会导致反序列化失败。
特殊场景处理:非JSON原生类型
JSON不支持所有编程语言的原生类型(如日期、时间、自定义对象),需通过“扩展方案”传递:
- 日期/时间:转换为ISO 8601格式字符串(如
"2023-10-01T12:00:00Z"),反序列化时再解析为日期对象; - 自定义对象:序列化为包含“类型标识”和“数据字段”的对象(如
{"@type": "User", "id": 1, "name": "张三"}),接收方通过类型标识反序列化; - 二进制数据:使用Base64编码后



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