第 39 课 · 阶段七 · 进阶主题
JSON 数据处理
JSON 是程序间交换数据的“通用语言”。这一课掌握 json 模块的序列化与反序列化,以及和文件、网络的配合。
🎯 学完本课你将掌握
- 理解 JSON 数据结构
- 掌握 json.dumps / json.loads
- 掌握 JSON 与文件的读写
- 处理中文字符与复杂对象
一、什么是 JSON
JSON(JavaScript Object Notation)是一种轻量级数据格式,长得像 Python 的字典+列表组合。几乎所有编程语言都支持它,是前后端通信、配置文件、API 数据的标准格式。
JSON 长什么样
1{2 "name": "小明",3 "age": 10,4 "scores": [92, 88, 95],5 "address": {"city": "广州", "street": "天河路"}6}二、Python 与 JSON 类型对照
| Python | JSON |
|---|---|
| dict | 对象 { } |
| list / tuple | 数组 [ ] |
| str | 字符串 |
| int / float | 数字 |
| True / False | true / false |
| None | null |
三、json.dumps:Python → JSON 字符串
序列化.py
1import json23data = {4 "name": "小明",5 "age": 10,6 "scores": [92, 88, 95],7 "is_student": True8}9s = json.dumps(data)10print(s)11print(type(s)) # <class 'str'>四、json.loads:JSON 字符串 → Python
反序列化.py
1import json2s = '{"name": "小明", "age": 10, "ok": true, "none": null}'3d = json.loads(s)4print(d["name"]) # 小明5print(d["ok"]) # True6print(d["none"]) # None五、中文与格式化参数
中文处理.py
1import json2data = {"名字": "小明", "爱好": ["篮球", "编程"]}34# ensure_ascii=False 让中文正常显示(默认会变成\uXXXX)5s = json.dumps(data, ensure_ascii=False, indent=2)6print(s)78# indent 参数让 JSON 更好看六、与文件读写配合
JSON 文件.py
1import json23# 写入文件4data = {"name": "小明", "score": 95}5with open("student.json", "w", encoding="utf-8") as f:6 json.dump(data, f, ensure_ascii=False, indent=2)78# 读取文件9with open("student.json", "r", encoding="utf-8") as f:10 d = json.load(f)11print(d["name"], d["score"]) # 小明 95✅ 要点
注意:dump/load 对文件操作,dumps/loads 对字符串操作,别记混!
七、常见错误与解决
常见错误与解决
| 错误现象 | 原因 / 解决方法 |
|---|---|
json.decoder.JSONDecodeError | JSON 字符串不合法:引号必须是英文双引号、不能有注释、结尾不能有逗号。 |
TypeError: Object of type set is not JSON serializable | JSON 不支持 set,先转 list。 |
中文变成 \uXXXX | dumps 时加 ensure_ascii=False。 |
✍️ 小练习
把自己个人信息存成 dict,用 json.dump 写入 info.json;再读取并打印;尝试把一个 tuple 列表序列化(先转 list)。
📌 本节小结
json 模块四兄弟:dumps/loads 管字符串、dump/load 管文件;ensure_ascii=False 保中文、indent=2 美化输出。JSON 是数据交换的通用语,后端、爬虫、配置到处都在用。