Python3 JSON
JSON 是一种轻量级数据交换格式,用 { } 组织键值对、用 [ ] 组织数组,几乎所有编程语言都支持,是前后端通信与接口返回数据的事实标准。Python 的 json 模块负责在 JSON 文本与 Python 对象(字典、列表等)之间互相转换。
JSON 的样子
{
"name": "张三",
"age": 25,
"hobbies": ["读书", "编程"]
}
json.dumps 与 json.loads
dumps 把 Python 对象转成 JSON 字符串,loads 把 JSON 字符串解析回 Python 对象:
import json
data = {"name": "张三", "age": 25}
s = json.dumps(data)
print(s) # 输出:{"name": "\u5f20\u4e09", "age": 25}
obj = json.loads(s)
print(obj["name"]) # 输出:张三
ensure_ascii=False 保留中文
dumps 默认把中文等非 ASCII 字符转成 \uXXXX,人不可读。加 ensure_ascii=False 即原样输出中文:
import json
data = {"name": "张三", "age": 25}
print(json.dumps(data, ensure_ascii=False)) # 输出:{"name": "张三", "age": 25}
向文件写入或对接接口时务必带上 ensure_ascii=False,否则中文会变成转义串,难以阅读和调试。
文件读写 dump 与 load
dump 直接写入文件,load 从文件读取,常配合 with open 并指定 encoding='utf-8':
import json
data = {"name": "张三", "age": 25}
with open('user.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False) # 写入文件
with open('user.json', 'r', encoding='utf-8') as f:
obj = json.load(f) # 读回 Python 对象
print(obj["age"]) # 输出:25
sort_keys 与 indent 美化
sort_keys 按字典键排序,indent 缩进换行,输出更易读,方便调试和展示:
import json
d = {"b": 1, "a": 2}
print(json.dumps(d, sort_keys=True, indent=2))
# 输出:
# {
# "a": 2,
# "b": 1
# }
Python 与 JSON 类型对照
| Python | JSON | 说明 |
|---|---|---|
| dict | object | 对象 |
| list / tuple | array | 数组 |
| str | string | 字符串 |
| int / float | number | 数字 |
| True / False | true / false | 布尔 |
| None | null | 空值 |
注意:元组会被转成数组;bytes、set 等类型没有 JSON 对应形式,直接 dumps 会报错。
常见错误 JSONDecodeError
解析不合法的 JSON 文本会抛出 json.JSONDecodeError,最好用 try/except 兜底:
import json
try:
json.loads('{"name": 123') # 缺少右括号
except json.JSONDecodeError as e:
print("解析失败:", e) # 输出:解析失败:Expecting ',' delimiter...
小结
记住四件套:dumps/loads 处理字符串,dump/load 处理文件,中文输出加 ensure_ascii=False,调试美化用 indent。json 模块让你轻松完成"对象与文本"之间的序列化转换。