Base Tools-Associate-Third:json库详解
关联标准1:JSON(JavaScript Object Notation)
关联标准2:ECMAScript 2024(ECMAScript 2024 Language Specification)语言规范
一、json 库核心概念
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,Python 的 json 库是处理 JSON 数据的标准库,无需额外安装,直接导入即可使用,专门用于将 Python 数据结构与 JSON 字符串相互转换(序列化 / 反序列化)
| 方向 | 术语 | 作用 | json 库方法 |
|---|---|---|---|
| Python → JSON | 序列化(encode) | 将 Python 对象转为 JSON 字符串 |
json.dumps() / json.dump()
|
| JSON → Python | 反序列化(decode) | 将 JSON 字符串转为 Python 对象 |
json.loads() / json.load()
|
二、核心方法详解
序列化:Python 对象转 JSON
1.json.dumps():转为 JSON 字符串
最常用的方法,接收 Python 对象,返回对应的 JSON 字符串
import json
# 1. 基础使用:Python 字典转 JSON 字符串
python_dict = {"name": "张三", "age": 20, "is_student": True, "hobbies": ["篮球", "编程"]}
json_str = json.dumps(python_dict)
print(type(json_str)) # <class 'str'>
print(json_str) # {"name": "u5f20u4e09", "age": 20, "is_student": true, "hobbies": ["u7beeu7403", "u7f16u7a0b"]}
# 2. 优化输出:解决中文乱码、格式化排版
json_str_pretty = json.dumps(
python_dict,
ensure_ascii=False, # 保留中文,不转为 Unicode 编码
indent=4, # 缩进4个空格,美化格式
sort_keys=True # 按键名排序
)
print(json_str_pretty)
"""
输出:
{
"age": 20,
"hobbies": [
"篮球",
"编程"
],
"is_student": true,
"name": "张三"
}
"""
2.json.dump():直接写入文件
将 Python 对象序列化后写入文件(无需手动打开文件再写),适合将 JSON 数据保存到本地
import json
python_data = {"name": "李四", "score": 95.5}
# 将数据写入 json 文件
with open("data.json", "w", encoding="utf-8") as f:
json.dump(python_data, f, ensure_ascii=False, indent=2)
# 执行后会生成 data.json 文件,内容为格式化后的 JSON
反序列化:JSON 转 Python 对象
1.json.loads():解析 JSON 字符串
接收 JSON 格式的字符串,返回对应的 Python 数据结构(字典、列表等)
import json
# JSON 字符串(注意:JSON 中键必须是双引号,布尔值是 true/false,null 对应 Python 的 None)
json_str = '{"name": "王五", "age": 18, "is_student": false, "address": null}'
python_obj = json.loads(json_str)
print(type(python_obj)) # <class 'dict'>
print(python_obj) # {'name': '王五', 'age': 18, 'is_student': False, 'address': None}
print(python_obj["name"])# 王五
2.json.load():从文件读取 JSON
直接读取 JSON 文件并转为 Python 对象,适合读取本地 JSON 文件
import json
# 读取之前生成的 data.json 文件
with open("data.json", "r", encoding="utf-8") as f:
python_data = json.load(f)
print(type(python_data)) # <class 'dict'>
print(python_data["score"]) # 95.5
三、数据类型映射(重点)
JSON 和 Python 的数据类型并非完全一致,转换时会自动映射,这是容易出错的点:
| JSON 类型 | Python 类型 |
|---|---|
| object | dict |
| array | list |
| string | str |
| number (int/float) | int/float |
| true | True |
| false | False |
| null | None |
⚠️ 注意:
- JSON 不支持 Python 的
tuple(元组),序列化时会被转为列表 - JSON 不支持 Python 的
set(集合),直接序列化会报错,需手动处理 - JSON 键必须是字符串(双引号),Python 字典的键可以是任意可哈希类型(如数字),反序列化后会转为字符串
四、进阶用法:自定义序列化 / 反序列化
如果需要处理特殊对象(如自定义类、日期对象),默认的 json 方法无法直接转换,需自定义编码器 / 解码器
示例:处理 datetime 日期对象
import json
from datetime import datetime
# 自定义编码器:处理 datetime 对象
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S") # 转为字符串
return super().default(obj) # 其他类型按默认处理
# 序列化:包含日期对象的 Python 字典
python_data = {
"name": "赵六",
"create_time": datetime.now()
}
json_str = json.dumps(python_data, cls=DateTimeEncoder, ensure_ascii=False, indent=2)
print(json_str)
"""
输出:
{
"name": "赵六",
"create_time": "2025-12-19 10:00:00" # 日期转为指定格式的字符串
}
"""
# 自定义解码器:将字符串转回 datetime 对象
def datetime_decoder(obj):
if "create_time" in obj:
obj["create_time"] = datetime.strptime(obj["create_time"], "%Y-%m-%d %H:%M:%S")
return obj
# 反序列化
python_obj = json.loads(json_str, object_hook=datetime_decoder)
print(type(python_obj["create_time"])) # <class 'datetime.datetime'>
五、常见错误及解决
-
JSON 格式错误:如键用单引号、布尔值首字母大写(True)、逗号多余等,反序列化时会报
JSONDecodeError,需检查 JSON 字符串格式 -
中文乱码:序列化时未加
ensure_ascii=False,导致中文转为 Unicode 编码,添加该参数即可解决 -
不支持的类型:如序列化
set或自定义类,需自定义编码器(如上例)
总结
-
json库是 Python 处理 JSON 数据的标准库,核心是序列化(dumps/dump) 和反序列化(loads/load) 两类方法 - 注意 JSON 与 Python 数据类型的映射关系(如 JSON 的
true对应 Python 的True,null对应None) -
处理中文或格式化输出时,需添加
ensure_ascii=False和indent参数,处理特殊对象需自定义编码器 / 解码器
© 版权声明
文章版权归作者所有,未经允许请勿转载。