Python JSON模块详解:全方位指南
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,Python 通过 json
模块提供了 JSON 数据的编码和解码功能。
1. 核心函数概览
函数 | 描述 | 常用场景 |
---|---|---|
json.load() |
从文件读取并解析 JSON 数据 | 读取 JSON 文件 |
json.loads() |
从字符串解析 JSON 数据 | 处理 API 响应 |
json.dump() |
将 Python 对象写入 JSON 文件 | 数据持久化 |
json.dumps() |
将 Python 对象转为 JSON 字符串 | 网络传输 |
2. JSON 解码(读取/解析)
2.1 json.load()
从文件对象读取 JSON 数据并解码为 Python 对象。
语法:
python
复制
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
示例:
python
复制
import json with open('data.json', 'r', encoding='utf-8') as f: data = json.load(f)
参数说明:
fp
: 文件对象(必须可读)
object_hook
: 自定义字典解码函数
parse_float
: 自定义浮点数解码
parse_int
: 自定义整数解码
2.2 json.loads()
从字符串解析 JSON 数据。
语法:
python
复制
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
示例:
python
复制
json_str = '{"name": "John", "age": 30}' data = json.loads(json_str)
3. JSON 编码(写入/序列化)
3.1 json.dump()
将 Python 对象编码为 JSON 并写入文件。
语法:
python
复制
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
示例:
python
复制
data = {"name": "张三", "age": 25} with open('output.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2)
3.2 json.dumps()
将 Python 对象编码为 JSON 字符串。
语法:
python
复制
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
示例:
python
复制
data = {"name": "李四", "scores": [95, 88, 92]} json_str = json.dumps(data, indent=2, ensure_ascii=False)
4. 高级功能
4.1 自定义编码器(JSONEncoder)
处理无法默认序列化的对象。
示例:
python
复制
from datetime import datetime import json class CustomEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.isoformat() return super().default(obj) data = {"event": "会议", "time": datetime.now()} json_str = json.dumps(data, cls=CustomEncoder)
4.2 自定义解码器
示例:
python
复制
def datetime_decoder(dct): if 'time' in dct: try: dct['time'] = datetime.fromisoformat(dct['time']) except (ValueError, KeyError): pass return dct json_str = '{"event": "会议", "time": "2023-07-20T14:30:00"}' data = json.loads(json_str, object_hook=datetime_decoder)
5. 参数详解
5.1 常用参数
参数 | 描述 | 默认值 |
---|---|---|
ensure_ascii |
是否转义非ASCII字符 | True |
indent |
缩进空格数(美化输出) | None |
sort_keys |
是否按键排序 | False |
separators |
指定分隔符 | (',', ':') |
5.2 安全相关参数
参数 | 描述 |
---|---|
allow_nan |
是否允许NaN等特殊浮点值 |
check_circular |
是否检查循环引用 |
6. 异常处理
异常 | 描述 |
---|---|
json.JSONDecodeError |
JSON解析错误 |
TypeError |
无法序列化的对象 |
ValueError |
循环引用等值错误 |
处理示例:
python
复制
try: data = json.loads(invalid_json_str) except json.JSONDecodeError as e: print(f"JSON解析错误: {e}")
7. 最佳实践
-
文件操作始终使用上下文管理器:
python
复制
with open('data.json') as f: data = json.load(f)
-
处理非ASCII内容:
python
复制
json.dumps(data, ensure_ascii=False)
-
性能考虑:
-
大文件使用
ijson
等流式解析库 -
生产环境考虑紧凑格式(
indent=None
) -
安全性:
-
不要解析不受信任的JSON数据
-
考虑使用
json.JSONDecoder
的严格模式
8. 完整示例
python
复制
import json from datetime import datetime # 自定义编码器 class CustomEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.isoformat() return super().default(obj) # 编码示例 data = { "name": "王五", "age": 28, "register_date": datetime.now(), "skills": ["Python", "SQL"] } # 序列化为字符串 json_str = json.dumps(data, cls=CustomEncoder, ensure_ascii=False, indent=2) print("JSON字符串:") print(json_str) # 写入文件 with open('user.json', 'w', encoding='utf-8') as f: json.dump(data, f, cls=CustomEncoder, ensure_ascii=False) # 从文件读取 with open('user.json', 'r', encoding='utf-8') as f: loaded_data = json.load(f) print("\n从文件加载的数据:") print(loaded_data)
9. 总结对比表
操作 | 文件 | 字符串 |
---|---|---|
编码 | json.dump() |
json.dumps() |
解码 | json.load() |
json.loads() |
通过掌握这些函数和技巧,您可以高效地在Python中处理各种JSON数据交换场景。
作者:叫醒你笛莎