JSON
理解 JSON 格式的特点与应用场景
掌握
json模块序列化与反序列化的四种核心方法能处理复杂类型的 JSON 序列化,解决中文乱码问题
核心讲解
JSON(JavaScript Object Notation)是轻量级的数据交换格式,是网络传输、配置文件、API 交互的事实标准,Python 内置 json 模块处理 JSON 数据。
(1)JSON 与 Python 类型对应
表格
JSON 类型 | Python 类型 |
|---|---|
object | dict 字典 |
array | list 列表 |
string | str 字符串 |
number | int/float 数字 |
true/false | True/False 布尔值 |
null | None 空值 |
(2)四大核心方法
表格
方法 | 功能 | 场景 |
|---|---|---|
| Python 对象 → JSON 字符串 | 内存中转换、网络传输 |
| JSON 字符串 → Python 对象 | 解析收到的 JSON 数据 |
| Python 对象 → 写入 JSON 文件 | 保存数据到文件 |
| 读取 JSON 文件 → Python 对象 | 从文件加载数据 |
(3)关键参数
ensure_ascii=False:关闭 ASCII 转码,正常显示中文,必加参数indent=2:格式化缩进,让 JSON 更易读sort_keys=True:按键名排序default:自定义序列化函数,处理 datetime 等不支持的类型
代码示例
import json
from datetime import datetime
# ===== 1. 序列化:Python转JSON =====
data = {
"name": "张三",
"age": 25,
"is_student": False,
"hobbies": ["编程", "读书", "跑步"],
"address": {
"city": "成都",
"district": "锦江区"
},
"score": None
}
# 转JSON字符串
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print("JSON字符串:")
print(json_str)
print(type(json_str)) # <class 'str'>
# ===== 2. 反序列化:JSON转Python =====
json_text = '{"name": "李四", "age": 22, "scores": [90, 85, 95]}'
obj = json.loads(json_text)
print("\n解析后:")
print(obj["name"])
print(obj["scores"])
print(type(obj)) # <class 'dict'>
# ===== 3. 读写JSON文件 =====
# 写入文件
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# 读取文件
with open("data.json", "r", encoding="utf-8") as f:
file_data = json.load(f)
print("\n从文件读取:", file_data["name"])
# ===== 4. 处理不支持的类型(如datetime) =====
# datetime不能直接序列化,需要自定义转换
def custom_serializer(obj):
if isinstance(obj, datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S")
raise TypeError(f"Type {type(obj)} not serializable")
log_data = {
"time": datetime.now(),
"level": "info",
"message": "操作成功"
}
log_json = json.dumps(log_data, ensure_ascii=False, default=custom_serializer)
print("\n带时间的JSON:", log_json)
常见误区
中文乱码:不加
ensure_ascii=False,中文会变成\uXXXX转义字符,读写都要加类型不支持:datetime、自定义类等不能直接序列化,会报 TypeError,需要自定义 default 函数
格式错误:手动拼接 JSON 字符串很容易语法错误,永远用 json 模块生成,不要自己拼
文件编码不匹配:读写 JSON 文件都要指定
encoding="utf-8",否则 Windows 默认 GBK 会乱码浮点数精度问题:JSON 数字转 Python 可能出现精度误差,高精度场景注意处理
课后练习
定义一个学生信息字典,序列化为 JSON 字符串并打印,要求中文正常显示、格式化缩进
把上面的 JSON 保存到
student.json文件中读取
student.json文件,修改年龄字段,再写回文件尝试序列化一个包含 datetime 对象的数据,自定义转换方法

