第 39 课 · 阶段七 · 进阶主题

JSON 数据处理

JSON 是程序间交换数据的“通用语言”。这一课掌握 json 模块的序列化与反序列化,以及和文件、网络的配合。

第 39 课阶段七 · 进阶主题难度:进阶建议时长:35 分钟关键词:json · dump · load · 数据交换

🎯 学完本课你将掌握

  • 理解 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 类型对照

PythonJSON
dict对象 { }
list / tuple数组 [ ]
str字符串
int / float数字
True / Falsetrue / false
Nonenull

三、json.dumps:Python → JSON 字符串

序列化.py
1import json
2
3data = {
4 "name": "小明",
5 "age": 10,
6 "scores": [92, 88, 95],
7 "is_student": True
8}
9s = json.dumps(data)
10print(s)
11print(type(s)) # <class 'str'>

四、json.loads:JSON 字符串 → Python

反序列化.py
1import json
2s = '{"name": "小明", "age": 10, "ok": true, "none": null}'
3d = json.loads(s)
4print(d["name"]) # 小明
5print(d["ok"]) # True
6print(d["none"]) # None

五、中文与格式化参数

中文处理.py
1import json
2data = {"名字": "小明", "爱好": ["篮球", "编程"]}
3
4# ensure_ascii=False 让中文正常显示(默认会变成\uXXXX)
5s = json.dumps(data, ensure_ascii=False, indent=2)
6print(s)
7
8# indent 参数让 JSON 更好看

六、与文件读写配合

JSON 文件.py
1import json
2
3# 写入文件
4data = {"name": "小明", "score": 95}
5with open("student.json", "w", encoding="utf-8") as f:
6 json.dump(data, f, ensure_ascii=False, indent=2)
7
8# 读取文件
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.JSONDecodeErrorJSON 字符串不合法:引号必须是英文双引号、不能有注释、结尾不能有逗号。
TypeError: Object of type set is not JSON serializableJSON 不支持 set,先转 list。
中文变成 \uXXXXdumps 时加 ensure_ascii=False。
✍️ 小练习
把自己个人信息存成 dict,用 json.dump 写入 info.json;再读取并打印;尝试把一个 tuple 列表序列化(先转 list)。
📌 本节小结
json 模块四兄弟:dumps/loads 管字符串、dump/load 管文件;ensure_ascii=False 保中文、indent=2 美化输出。JSON 是数据交换的通用语,后端、爬虫、配置到处都在用。