Python用标准库 json 在字典(以及列表等结构)与 JSON 文本之间转换。接口调用、配置文件、前后端传数据时经常用到。dumps / loads 面向字符串,dump / load 面向文件对象。
字典变成 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 时中文会按原文写出,而不是 \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 的是字符串版,不带 s 的直接读写文件。写文件时同样建议指定 UTF-8,并按需关闭 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。