第 10 课 · 入门 · 18 分钟

Python JSON 入门

把 JSON 文本变成 Python 值,读取嵌套记录,再把数据写回 JSON。

loads 与 dumps嵌套查找遍历记录

姑妈要的是当天的数字,不是一张截图。JSON 把 Python 字典变成另一段程序也能读回来的文字。这一来一回,什么留了下来,什么又悄悄换了类型?

JSON 是一种结构化文本格式,API 和配置文件经常使用它。Python 的 json 模块可以在 JSON 文本与字典、列表、字符串、数字、布尔值和 None 之间转换。 你还会在索引前校验解码后的 JSON,并生成稳定输出。

解析与序列化

json.loads(text) 把 JSON 字符串解析成 Python 值。json.dumps(value) 把 Python 值转成 JSON 文本。loads 和 dumps 末尾的 s 表示字符串;load 和 dump 用于文件对象。

import json
raw = '{"drink": "拿铁", "price": 4.5}'
data = json.loads(raw)
print(data["drink"])
print(json.dumps(data))

文本与 Python 值互转

读取嵌套数据

JSON 对象会变成字典,JSON 数组会变成列表。连续使用键和索引就能到达嵌套值。需要汇总每条记录时,遍历记录列表。

import json
raw = '{"items": [{"name": "拿铁"}, {"name": "茶"}]}'
data = json.loads(raw)
for item in data["items"]:
    print(item["name"])

嵌套记录

让输出更易读

json.dumps 可以接收 indent 进行美化,sort_keys 可以稳定键的顺序。这些选项适合配置文件和调试,不会改变底层值。

import json
data = {"b": 2, "a": 1}
print(json.dumps(data, indent=2, sort_keys=True))

可读的 JSON

索引前先校验结构

json.loads() 只验证 JSON 语法,不验证你的 schema。解码结果可能是列表而不是字典,字段也可能缺失。先检查容器类型,再逐层检查键,最后才索引。

import json
raw = '{"order": {"items": [{"name": "latte", "qty": 2}]}}'
data = json.loads(raw)
order = data.get("order", {})
items = order.get("items", [])
print(isinstance(items, list), len(items))
if items and isinstance(items[0], dict):
    print(items[0].get("name", "unknown"))

语法正确不等于结构正确

让 JSON 输出保持稳定

sort_keys=True 让输出在不同运行之间保持稳定,indent=2 让内容可读。给机器用紧凑输出,给日志或教学用缩进输出;需要保留中文等非英文字符时,用 ensure_ascii=False。

import json
payload = {"total": 12.0, "items": ["latte", "tea"], "note": "café"}
print(json.dumps(payload, sort_keys=True))
print(json.dumps(payload, indent=2, sort_keys=True, ensure_ascii=False))

稳定的键顺序与可读的 Unicode

JSON 不是 Python

JSON 只有对象、数组、字符串、数字、布尔值和 null。Python 元组会变成数组,整数键会变成字符串,None 会变成 null。因此往返一次不一定保留原来的 Python 类型。用 sort_keys=True 让输出稳定;需要直接阅读非 ASCII 文字时,用 ensure_ascii=False。

import json

payload = {"count": 2, "tags": ("tea", "latte"), "note": None}
text = json.dumps(payload, sort_keys=True)
print(text)
print(json.loads(text))

元组变成了数组

本课要点

  • json.loads 解析字符串,json.dumps 序列化为字符串。
  • JSON 对象对应字典,JSON 数组对应列表。
  • 用连续的键和索引读取嵌套值。
  • indent 和 sort_keys 让 JSON 更容易检查。
  • JSON 语法合法不代表结构符合预期。
  • JSON 的类型比 Python 少;往返转换可能改变容器类型。

常见错误

  • 对字符串调用 json.load,而不是 json.loads。
  • 在 JSON 文本里使用单引号;JSON 字符串必须使用双引号。
  • 忘记 JSON 的 null 会变成 Python 的 None。
  • 解码后不检查类型就直接索引。
  • 以为元组或整数键经过 json.dumps() 和 json.loads() 后还是原类型。
轮到你

解析一个包含 items 列表的 JSON 对象,对数字求和并打印总数。

动手试试

改改变量、先预测输出,再运行代码。第一次点击“运行代码”时会下载 Python 运行时,可能需要几秒钟。

浏览器内 Python本地运行 · 无需账号
首次运行会从 CDN 下载 Pyodide。修改后点击“运行代码”。

练习本课

12 道题,作答后立即看到解释。

查看 12 道题答案开始练习
← 错误处理while 循环 →