Python处理JSON核心是序列化(dumps/dump)与反序列化(loads/load),前者转对象为字符串或文件,后者反之;需注意编码、类型兼容性及安全性。

Python 中处理 JSON 数据,核心就是序列化(把 Python 对象转成 JSON 字符串)和反序列化(把 JSON 字符串转回 Python 对象)。关键在 json 模块的 dumps/loads 与 dump/load 四个函数,区别只在于操作对象是字符串还是文件。
序列化:Python 对象 → JSON 字符串或文件
用 json.dumps() 得到字符串,适合网络传输、日志记录或拼接;用 json.dump() 直接写入文件,省去手动打开写入步骤。
-
json.dumps(data, indent=2, ensure_ascii=False):加indent让输出美观,ensure_ascii=False保留中文等非 ASCII 字符 -
json.dump(data, open("data.json", "w", encoding="utf-8"), indent=2, ensure_ascii=False):直接保存为可读 JSON 文件 - 注意:不支持 set、datetime、自定义类等类型,会报
TypeError;需通过default参数自定义转换逻辑
反序列化:JSON 字符串或文件 → Python 对象
json.loads() 解析字符串,json.load() 从文件对象读取并解析。两者都返回标准 Python 数据结构(dict、list、str、int、float、bool、None)。
-
data = json.loads('{"name": "张三", "age": 25}')→ 得到字典{'name': '张三', 'age': 25} -
with open("data.json", encoding="utf-8") as f: data = json.load(f):安全读取文件内容并解析 - 遇到格式错误(如多逗号、单引号、中文引号)会抛
JSONDecodeError,建议用 try-except 捕获并提示原始出错位置
处理常见不兼容类型(如 datetime、Decimal)
JSON 标准不支持 Python 特有类型,需主动转换。推荐用 default 参数统一处理,而非提前遍历修改数据结构。
立即学习“Python免费学习笔记(深入)”;
- 对
datetime:在default函数中判断isinstance(obj, datetime),返回obj.isoformat() - 对
Decimal:转为float或字符串,避免精度丢失(如str(obj)) - 自定义类可定义
to_json()方法,并在default中调用,保持扩展性
安全与编码注意事项
JSON 本质是文本,编码和来源可信度直接影响解析成败。
- 读文件务必指定
encoding="utf-8",Windows 默认编码可能引发乱码或解码错误 - 不要用
eval()或ast.literal_eval()解析 JSON 字符串——不安全且不标准 - 来自外部(如 API、用户输入)的 JSON 数据,应先校验结构(可用
pydantic或简单if "key" in data判断),再使用 - 敏感字段(如密码、token)不应直接序列化进日志或调试输出










