在 Python 中,标准库 json 在字典、列表等结构与 JSON 文本之间转换,常用于接口数据、配置文件及前后端交换。dumps / loads 面向字符串,dump / load 面向文件对象。JSON 键须用双引号,与 Python 字面量语法并不相同。本节说明常用 API 及类型对应关系。
字典序列化为 JSON 字符串
import json
data = {"name": "Tom", "age": 20, "skills": ["py", "c"]}
json_str = json.dumps(data)
print(json_str)
print(type(json_str))dumps 的常用参数
indent 可输出带缩进的字符串,便于阅读。ensure_ascii=False 时非 ASCII 字符(如中文)按原文写出,而非 \uXXXX 转义:
import json
data = {"name": "Tom", "age": 20}
print(json.dumps(data))
print(json.dumps(data, indent=2))
print(json.dumps({"n": "小明"}, ensure_ascii=False))loads:字符串解析为对象
import json
s = '{"name": "Tom", "age": 20}'
data = json.loads(s)
print(data["name"])
print(type(data))文本不符合 JSON 语法时将引发 json.JSONDecodeError,可用 try 捕获:
try:
data = json.loads('{"a": }')
except json.JSONDecodeError as e:
print("JSON 格式错误:", e)读写 JSON 文件
带 s 的 API 处理字符串;不带 s 的直接读写文件。写文件时建议指定 UTF-8 编码,并按需设置 ensure_ascii:
import json
data = {"name": "Tom", "age": 20}
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
with open("data.json", "r", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded["name"])类型对应关系
| JSON | Python |
|---|---|
{"k": "v"} | dict |
[1, 2] | list |
"text" | str |
123 | int |
1.5 | float |
true / false | True / False |
null | None |
JSON 中的布尔与空值为小写 true、false、null,与 Python 的 True、False、None 不同,模块在转换时会自动映射。
嵌套结构
import json
s = '{"user": {"name": "Tom", "tags": ["a", "b"]}}'
data = json.loads(s)
print(data["user"]["name"])
print(data["user"]["tags"][0])常见错误
- JSON 字符串中的键须用双引号;Python 字典的单引号写法不能直接交给
loads。 - 元组经
dumps变为 JSON 数组,loads后得到列表,不再是元组。 - 须保留可读中文时,应设置
ensure_ascii=False。
本节说明了 Python 中 json 模块的常用接口。下一节介绍日期与时间:datetime 的格式化与解析。