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 类型对照

PythonJSON说明
dictobject对象
list / tuplearray数组
strstring字符串
int / floatnumber数字
True / Falsetrue / false布尔
Nonenull空值

注意:元组会被转成数组;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 模块让你轻松完成"对象与文本"之间的序列化转换。

笔记加载中…