课程库 › AI 主线 › 文件与自动化脚本 › 第 3 课
处理 JSON —— API 时代的通用语言
普通课约 55 分钟
本课导读
U1.1 学嵌套结构时埋过一句话:"这就是 JSON 的形状"。今天正式收网:JSON 是互联网上程序与程序对话的通用语言——你将来调用 AI 接口,发出去的请求、收回来的回答,全是 JSON。本课学 json 模块的四个函数(两对),外加实战解析一份"模拟 AI 接口返回"——学完你会发现,所谓解析 JSON,就是 U1.1 的剥洋葱。预计 55 分钟。
JSON 长什么样
JSON(JavaScript Object Notation)是一种文本格式,规则你几乎已经全会——因为它和 Python 的字典/列表长得九成像:
{
"name": "小雨",
"age": 28,
"skills": ["Python", "SQL"],
"vip": true,
"address": {"city": "上海", "zip": null}
}
对照差异就五处,看一遍就记住:
| Python | JSON | 说明 |
|---|---|---|
True / False | true / false | 小写 |
None | null | 换了名字 |
| 键可以单引号 | 键必须双引号 | JSON 更严格 |
| 有元组、集合 | 只有对象 和数组 [] | JSON 类型更少 |
| 是活的数据结构 | 是一串文本 | 本质区别 |
最后一行是理解一切的钥匙:JSON 是文本(一个大字符串),Python 字典是内存里的活结构。所以核心操作只有两个方向:文本 ⇄ 结构。
两对函数:loads/dumps 与 load/dump
第一对管字符串(s = string):
dumps 的两个常用参数,中文用户必备:
ensure_ascii=False——不加的话中文会变成小雨这种转义码(数据没坏,但没法看)indent=2——缩进美化,给人看的 JSON 都建议加
第二对管文件(少个 s,多个文件参数),和上节课的文件功夫无缝对接:
提示
四个函数一句话记全:s 结尾管字符串,不带 s 管文件;load 往里读,dump 往外倒。这个 settings.json 的例子不是玩具——无数真实软件的配置文件就是这么存的(VS Code 的设置就是 JSON,U1.4 你马上会亲眼见到)。
实战:解析一份"AI 接口返回"
你将来调用 AI 模型接口,收到的回复长这样(简化版,但结构是真的)。用剥洋葱三板斧拆它:
三个职业习惯,现在就养成:
- 拿到 JSON 文本第一件事是
loads,变成结构再说话;直接对着字符串做字符串切割是野路子 - 结构不熟就先整个 print 出来看(或
print(json.dumps(resp, indent=2, ensure_ascii=False))美化打印),看清形状再下手取值 - 可能缺席的字段用
.get()——接口文档说"可选"的字段,方括号硬取迟早 KeyError
CSV 还是 JSON?选型直觉
两课学完,给个选型心法:
| CSV | JSON | |
|---|---|---|
| 形状 | 扁平表格(行 × 列) | 任意嵌套(树状) |
| 强项 | 表格数据、Excel 无缝衔接 | 层次数据、API 通信、配置文件 |
| 弱项 | 存不了嵌套 | Excel 打不开、不适合百万行报表 |
| 你会在哪遇到 | 报表导出、数据集下载 | 接口返回、配置文件、程序间传数据 |
一句话:平的用 CSV,套娃的用 JSON。两种都读进 Python 后殊途同归——列表、字典、剥洋葱,一套功夫全通吃。
✍️ 练习
练习 1:通讯录存取
把通讯录(含嵌套)写进 contacts.json(要求人类可读:缩进 + 中文原样),再读回来打印第二个人的电话。
✅ 参考答案
import json
contacts = [
{"name": "小雨", "phone": "138-0000-1111", "tags": ["同事"]},
{"name": "老王", "phone": "137-5555-6666", "tags": ["客户", "重点"]}
]
with open("contacts.json", "w", encoding="utf-8") as f:
json.dump(contacts, f, ensure_ascii=False, indent=2)
with open("contacts.json", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded[1]["phone"])
练习 2:解析天气接口
下面是一份模拟天气接口的返回文本。解析后输出:城市名、今天的温度、后天(下标 2)会不会下雨(rain 为 true 打"带伞")。
✅ 参考答案
import json
weather_text = """{
"city": "杭州",
"forecast": [
{"day": "今天", "temp": 33, "rain": false},
{"day": "明天", "temp": 30, "rain": true},
{"day": "后天", "temp": 28, "rain": true}
]
}"""
w = json.loads(weather_text)
print(w["city"])
print(f'今天 {w["forecast"][0]["temp"]} 度')
if w["forecast"][2]["rain"]:
print("后天有雨,带伞")
JSON 里的 true 解析后就是 Python 的 True,直接进 if——两个世界的翻译 loads 都做好了。
练习 3:JSON 版积分账本(挑战)
用 JSON 文件做个可反复运行的积分账本:写函数 add_score(name, score)——读出 scores.json(不存在则从空字典起步,气囊伺候),给该用户加分,再写回文件。连续调用四次后打印最终账本。
💡 提示
骨架是"读 → 改 → 写":try 读文件 except FileNotFoundError 时 scores = ;加分用 scores.get(name, 0) + score;最后 dump 回去。
✅ 参考答案
import json
def add_score(name, score):
try:
with open("scores.json", encoding="utf-8") as f:
scores = json.load(f)
except FileNotFoundError:
scores = {}
scores[name] = scores.get(name, 0) + score
with open("scores.json", "w", encoding="utf-8") as f:
json.dump(scores, f, ensure_ascii=False, indent=2)
add_score("小雨", 20)
add_score("阿杰", 15)
add_score("小雨", 30)
add_score("丽丽", 10)
with open("scores.json", encoding="utf-8") as f:
print(f.read())
这个"读-改-写"循环就是最朴素的数据库雏形——程序有了跨次运行的记忆。三课功夫(文件、异常、字典)在 20 行里全员出勤。
📝 随堂测验
1. JSON 文本和 Python 字典的本质区别是?
2. json 模块四个函数的分工,正确的是?
3. json.dumps(data, ensure_ascii=False) 里这个参数是为了?
4. Python 的 None 和 True,进了 JSON 分别变成?
5. 解析接口返回时,对文档标注“可选”的字段应该?
本课小结
- JSON = 程序间对话的通用文本格式,形状就是"字典+列表"的嵌套;与 Python 五处小差异(true/null/双引号…)
- 四函数:s 管字符串、无 s 管文件;load 读入、dump 写出;中文场景 dumps 带
ensure_ascii=False, indent=2 - 解析三习惯:先 loads、看不清就美化打印、可选字段用 .get
- 选型:平的 CSV,套娃的 JSON;读进 Python 后一套功夫通吃
下一课补上最后一块拼图:路径与批量操作——一次处理一个文件是脚本,一次处理一百个才是自动化。
划选正文任意文字可高亮、批注或加入复习卡
讨论
载入中…