pin_drop当前位置:知识文库 ❯ 图文
Python json模块详解 - 序列化与解码入门教程
一、概述
json 是 Python 标准库中处理 JSON(JavaScript Object Notation)数据的核心模块。JSON 是一种轻量级的数据交换格式,广泛应用于 Web API、配置文件、数据存储等场景。json 模块提供了将 Python 对象序列化为 JSON 字符串(编码)和将 JSON 字符串反序列化为 Python 对象(解码)的完整功能,是前后端数据交互和跨语言数据交换的基础工具。
二、语法
代码示例
import json
# 编码:Python对象 -> JSON字符串
json_str = json.dumps(obj)
# 解码:JSON字符串 -> Python对象
obj = json.loads(json_str)
# 编码到文件
json.dump(obj, file)
# 从文件解码
obj = json.load(file)三、参数说明
json 模块的核心函数概览:
Python 与 JSON 类型映射:
四、返回值
-
dumps():返回 JSON 格式的
str -
loads():返回 Python 对象(dict、list、str、int、float、bool、None)
-
dump():无返回值(None),将 JSON 写入文件
-
load():返回从文件解析的 Python 对象
五、代码示例
示例1:基本编码与解码
代码示例
import json
# Python 对象
data = {
"name": "张三",
"age": 25,
"scores": [85, 92, 78],
"is_student": True,
"address": None,
}
# 编码为 JSON 字符串
json_str = json.dumps(data, ensure_ascii=False)
print(f"类型: {type(json_str).__name__}")
print(f"JSON: {json_str}")
# 解码为 Python 对象
parsed = json.loads(json_str)
print(f"\n类型: {type(parsed).__name__}")
print(f"姓名: {parsed['name']}")
print(f"成绩: {parsed['scores']}")输出:
代码示例
类型: str
JSON: {"name": "张三", "age": 25, "scores": [85, 92, 78], "is_student": true, "address": null}
类型: dict
姓名: 张三
成绩: [85, 92, 78]示例2:文件读写操作
代码示例
import json
data = {
"users": [
{"id": 1, "name": "张三", "role": "admin"},
{"id": 2, "name": "李四", "role": "user"},
],
"total": 2,
}
# 写入 JSON 文件
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print("已写入 data.json")
# 读取 JSON 文件
with open("data.json", "r", encoding="utf-8") as f:
loaded = json.load(f)
print(f"用户数: {loaded['total']}")
for user in loaded["users"]:
print(f" {user['id']}. {user['name']} ({user['role']})")输出:
代码示例
已写入 data.json
用户数: 2
1. 张三 (admin)
2. 李四 (user)示例3:格式化输出与类型验证
代码示例
import json
data = {"name": "Python", "version": 3.11, "features": ["简单", "强大", "优雅"]}
# 不同格式化选项
print("紧凑格式:")
print(json.dumps(data, ensure_ascii=False, separators=(',', ':')))
print("\n缩进格式:")
print(json.dumps(data, ensure_ascii=False, indent=2))
print("\n排序键:")
print(json.dumps(data, ensure_ascii=False, sort_keys=True, indent=2))
# 类型映射验证
json_str = '{"name": "test", "active": true, "count": 0, "data": null}'
parsed = json.loads(json_str)
print("\n类型映射:")
for key, value in parsed.items():
print(f" {key}: {value} -> {type(value).__name__}")输出:
代码示例
紧凑格式:
{"name":"Python","version":3.11,"features":["简单","强大","优雅"]}
缩进格式:
{
"name": "Python",
"version": 3.11,
"features": [
"简单",
"强大",
"优雅"
]
}
排序键:
{
"features": [
"简单",
"强大",
"优雅"
],
"name": "Python",
"version": 3.11
}
类型映射:
name: test -> str
active: True -> bool
count: 0 -> int
data: None -> NoneType六、实际应用场景
-
Web API 开发:处理 HTTP 请求和响应中的 JSON 数据,是 RESTful API 的标准数据格式
-
配置文件管理:使用 JSON 格式存储应用配置,支持嵌套结构和注释替代方案
-
数据持久化:将 Python 对象序列化为 JSON 文件,实现简单的数据存储和交换
七、注意事项
注意1:
json.dumps()默认将非 ASCII 字符转义为\uXXXX。处理中文时应设置ensure_ascii=False,否则中文会变成 Unicode 转义序列。
注意2:JSON 不支持 Python 的 set、tuple(转为数组)、bytes、datetime 等类型,需要自定义编码器或预先转换。
注意3:JSON 的键必须是字符串,Python dict 的非字符串键会被自动转换为字符串。
提示:对于复杂的序列化需求(如自定义对象、日期时间等),可以通过继承
json.JSONEncoder实现自定义编码器。
八、相关方法对比
九、小结
-
json模块是 Python 处理 JSON 数据的标准方案,提供编码(dumps/dump)和解码(loads/load)四项核心功能 -
Python 与 JSON 的类型映射清晰明确,基本类型可直接转换
-
处理中文时务必设置
ensure_ascii=False,格式化输出使用indent参数 -
JSON 不支持所有 Python 类型,复杂对象需自定义编码器或预先转换
十、练习题
练习1
编写一个函数,将包含中文的字典序列化为格式化的 JSON 字符串,并验证反序列化后数据一致。
练习2
编写一个配置文件管理类,支持从 JSON 文件加载配置、修改配置项、保存配置到文件。
练习3
对比 json 和 pickle 模块的区别,编写代码演示它们在序列化 set、自定义类实例时的不同行为。
小贴士
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,由 Douglas Crockford 在 2000 年代初提出。它基于 JavaScript 的对象字面量语法,但独立于语言,几乎所有现代编程语言都有 JSON 解析库。相比 XML,JSON 更简洁、解析更快,已成为 Web API 的事实标准。Python 从 2.6 版本起将 json 模块纳入标准库,底层由 C 实现,性能优异。
常见问题
json.dumps() 和 json.dump() 有什么区别?
dumps() 返回 JSON 格式的字符串,适用于网络传输和调试;dump() 直接将 JSON 写入文件对象,适用于数据持久化,更节省内存。
为什么处理中文时要设置 ensure_ascii=False?
默认 ensure_ascii=True 会将中文等非 ASCII 字符转义为 \uXXXX 格式的 Unicode 转义序列,设置 ensure_ascii=False 可以让中文字符原样输出,提高可读性。
JSON 能序列化 Python 的 set 和 tuple 吗?
set 不能直接序列化,需要先转为 list;tuple 会被转为 JSON 的 array(数组)类型。对于不支持的类型,可以使用 default 参数自定义序列化逻辑。
json 和 pickle 模块的主要区别是什么?
json 生成人类可读的文本格式,支持跨语言交换,安全性高;pickle 生成二进制格式,仅适用于 Python,支持所有 Python 对象但存在安全风险(可执行恶意代码)。
本文涉及AI创作
内容由AI创作,请仔细甄别