学径XUEJING · 个人学习平台通知设置

课程库 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}
}

对照差异就五处,看一遍就记住:

PythonJSON说明
True / Falsetrue / false小写
Nonenull换了名字
键可以单引号必须双引号JSON 更严格
有元组、集合只有对象 和数组 []JSON 类型更少
是活的数据结构是一串文本本质区别

最后一行是理解一切的钥匙:JSON 是文本(一个大字符串),Python 字典是内存里的活结构。所以核心操作只有两个方向:文本 ⇄ 结构。

两对函数:loads/dumps 与 load/dump

第一对管字符串(s = string):

Python

dumps 的两个常用参数,中文用户必备:

  • ensure_ascii=False——不加的话中文会变成 小雨 这种转义码(数据没坏,但没法看)
  • indent=2——缩进美化,给人看的 JSON 都建议加

第二对管文件(少个 s,多个文件参数),和上节课的文件功夫无缝对接:

Python

提示

四个函数一句话记全:s 结尾管字符串,不带 s 管文件;load 往里读,dump 往外倒。这个 settings.json 的例子不是玩具——无数真实软件的配置文件就是这么存的(VS Code 的设置就是 JSON,U1.4 你马上会亲眼见到)。

实战:解析一份"AI 接口返回"

你将来调用 AI 模型接口,收到的回复长这样(简化版,但结构是真的)。用剥洋葱三板斧拆它:

Python

三个职业习惯,现在就养成:

  • 拿到 JSON 文本第一件事是 loads,变成结构再说话;直接对着字符串做字符串切割是野路子
  • 结构不熟就先整个 print 出来看(或 print(json.dumps(resp, indent=2, ensure_ascii=False)) 美化打印),看清形状再下手取值
  • 可能缺席的字段用 .get()——接口文档说"可选"的字段,方括号硬取迟早 KeyError

CSV 还是 JSON?选型直觉

两课学完,给个选型心法:

CSVJSON
形状扁平表格(行 × 列)任意嵌套(树状)
强项表格数据、Excel 无缝衔接层次数据、API 通信、配置文件
弱项存不了嵌套Excel 打不开、不适合百万行报表
你会在哪遇到报表导出、数据集下载接口返回、配置文件、程序间传数据

一句话:平的用 CSV,套娃的用 JSON。两种都读进 Python 后殊途同归——列表、字典、剥洋葱,一套功夫全通吃。

✍️ 练习

练习 1:通讯录存取

把通讯录(含嵌套)写进 contacts.json(要求人类可读:缩进 + 中文原样),再读回来打印第二个人的电话。

Python
✅ 参考答案
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 打"带伞")。

Python
✅ 参考答案
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(不存在则从空字典起步,气囊伺候),给该用户加分,再写回文件。连续调用四次后打印最终账本。

Python
💡 提示

骨架是"读 → 改 → 写":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 行里全员出勤。

📝 随堂测验

随堂测验0 / 5 题正确

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 后一套功夫通吃

下一课补上最后一块拼图:路径与批量操作——一次处理一个文件是脚本,一次处理一百个才是自动化。

划选正文任意文字可高亮、批注或加入复习卡

讨论

载入中…