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数据交换场景。
作者:叫醒你笛莎