1. 快速了解 JSON 与 Python 的配合
为什么在 Python 中处理 JSON
在 Python 开发中,JSON 是数据交换中最常见的文本格式之一,它简单、跨语言、易于人眼阅读与解析。对于前后端通信、配置文件以及日志结构化输出,JSON 提供了稳定的方案。
本教程聚焦 Python JSON 文件读写与解析,从入门到实战,帮助你掌握高效处理 JSON 的核心方法。通过实践,你将理解如何将 Python 对象与 JSON 文本互相转换。
Python 与 JSON 的关系在于将字典、列表、字符串、数字、布尔值和空值等基本类型映射成 JSON 的对应结构,这使得数据在不同语言之间传递时保持一致性。
2. 序列化与反序列化的核心 API
常用函数与参数
序列化是将 Python 对象转换为 JSON 文本,反序列化则是将文本转换回 Python 对象,这是进行文件读写和数据处理的基础动作。
json.dumps 将对象序列化为字符串,json.dump 将对象直接写入到文件。通过参数可以控制输出格式和字符编码。
下面的示例演示如何将一个 Python 字典序列化为可读性较高的 JSON 文本,同时避免将中文字符转义。

import jsondata = {'name': '李四', 'city': '北京', 'items': [1, 2, 3]}
text = json.dumps(data, ensure_ascii=False, indent=2)
print(text)
接下来展示如何把 JSON 文本解析回 Python 对象,使用 json.loads。
loaded = json.loads(text)
print(loaded['name'])
3. JSON 文件的读写实战
从文件读取 JSON 配置与写出结果
在实际项目中,配置、缓存与请求结果等通常以 JSON 文件形式进行持久化。使用 with open 可以确保文件在操作完成后被正确关闭,提升健壮性。
对于较大结构的数据,推荐使用 json.load 与 json.dump,并通过 indent 提升可读性,ensure_ascii=False 支持中文等非 ASCII 字符正确显示。
import json# 读取 JSON 文件
with open('config.json', 'r', encoding='utf-8') as f:config = json.load(f)# 修改并写回配置
config['version'] = '1.2.3'
with open('config.json', 'w', encoding='utf-8') as f:json.dump(config, f, ensure_ascii=False, indent=2)
另外,json.load 与 json.loads 的差别在于前者读取自文件对象,后者读取自字符串。理解两者在不同场景中的应用可以提升代码的灵活性。
4. 处理复杂数据结构与错误处理
自定义对象的序列化与反序列化
遇到自定义对象时,需要提供默认序列化函数,通过 default 参数将对象转换为可序列化的字典结构,确保文本格式的兼容性。
class Point:def __init__(self, x, y):self.x = xself.y = ydef default(obj):if isinstance(obj, Point):return {'__Point__': True, 'x': obj.x, 'y': obj.y}raise TypeErrorp = Point(5, 7)
text = json.dumps(p, default=default)
print(text)
对于反序列化,可以通过 object_hook 将字典重新还原成自定义对象,提高数据在 Python 端的使用体验。
def object_hook(dct):if '__Point__' in dct:return Point(dct['x'], dct['y'])return dctdata = json.loads(text, object_hook=object_hook)
print(data.x, data.y)
此外,处理解析错误是日常任务。JSONDecodeError 提供了错误上下文,使用 try/except 捕获异常可以避免程序因为无效 JSON 而崩溃。
try:json.loads('{"name": "Alice", "age": 30') # 缺少右括号,语法错误
except json.JSONDecodeError as e:print('JSON 解析失败:', e)


