一、JSON模块基础与导入
JSON(JavaScript Object Notation)作为轻量级数据交换格式,已成为前后端通信、配置文件存储的核心标准。Python通过内置的json模块提供完整的JSON处理能力,无需额外安装依赖。导入方式如下:
import json # 标准导入方式# 或按需导入特定方法(推荐大型项目使用)from json import dumps, loads, dump, load
二、JSON编码:Python对象转字符串
1. 基础序列化
将Python对象转换为JSON字符串的核心方法是json.dumps(),支持字典、列表、字符串、数字、布尔值及None等基础类型:
data = {"username": "user_001","permissions": ["read", "write"],"is_active": True,"metadata": {"last_login": "2023-01-01","login_count": 42}}json_str = json.dumps(data)# 输出: {"username": "user_001", "permissions": ["read", "write"], ...}
2. 格式化输出优化
通过参数控制输出格式,提升可读性:
- 缩进控制:
indent参数指定缩进空格数 - ASCII转义:
ensure_ascii=False保留非ASCII字符(如中文) - 键排序:
sort_keys=True按字母顺序排列键
pretty_json = json.dumps(data, indent=2, ensure_ascii=False, sort_keys=True)"""{"is_active": true,"metadata": {"last_login": "2023-01-01","login_count": 42},"permissions": ["read","write"],"username": "user_001"}"""
3. 高级序列化技巧
自定义对象处理
当需要序列化datetime、Decimal等特殊类型时,可通过继承JSONEncoder实现:
from datetime import datetimefrom decimal import Decimalclass CustomEncoder(json.JSONEncoder):def default(self, obj):if isinstance(obj, datetime):return obj.isoformat()elif isinstance(obj, Decimal):return float(obj)return super().default(obj)data_with_special = {"transaction_time": datetime.now(),"amount": Decimal("19.99")}print(json.dumps(data_with_special, cls=CustomEncoder))# 输出: {"transaction_time": "2023-08-20T14:30:45.123456", "amount": 19.99}
性能优化建议
- 大数据量时使用
json.dump()直接写入文件流,避免内存中生成完整字符串 - 频繁序列化场景可预先编译正则表达式或使用
orjson等第三方加速库
三、JSON解码:字符串转Python对象
1. 基础反序列化
json.loads()将JSON字符串转换为Python字典或列表:
json_str = '{"product_id": 1001, "in_stock": true}'data = json.loads(json_str)print(type(data)) # <class 'dict'>
2. 文件读取操作
处理JSON文件时推荐使用json.load()直接读取文件对象:
with open('config.json', 'r', encoding='utf-8') as f:config = json.load(f)print(config['database']['host'])
3. 高级反序列化技巧
类型强制转换
通过parse_*参数控制特定类型的解析行为:
json_str = '{"temperature": "-10.5", "price": "19.99"}'data = json.loads(json_str,parse_float=lambda x: float(x) if '.' in x else int(x),parse_int=lambda x: int(x) if x.isdigit() else 0)# temperature转为float,price保持float
对象重构钩子
使用object_hook将JSON字典转换为自定义类实例:
class User:def __init__(self, uid, name):self.uid = uidself.name = namedef user_decoder(dct):if 'uid' in dct and 'name' in dct:return User(dct['uid'], dct['name'])return dctjson_str = '{"uid": 1001, "name": "Alice"}'user = json.loads(json_str, object_hook=user_decoder)print(f"{user.name}'s ID: {user.uid}")
四、常见问题处理
1. 编码异常处理
捕获JSONDecodeError处理格式错误的JSON:
from json.decoder import JSONDecodeErrortry:data = json.loads('invalid json')except JSONDecodeError as e:print(f"解析错误: {e.msg} (位置: {e.pos})")
2. 循环引用处理
当对象包含循环引用时,需实现default方法或使用第三方库:
class Node:def __init__(self, value):self.value = valueself.next = Nonea = Node(1)a.next = a # 循环引用# 解决方案1:跳过循环引用def safe_encoder(obj):if isinstance(obj, Node):return {'value': obj.value}raise TypeError# 解决方案2:使用第三方库(如`orjson`支持循环引用)
3. 大数据量优化
处理GB级JSON文件时建议:
- 使用流式解析器(如
ijson库) - 分块处理JSON数组
- 采用二进制格式(如MessagePack)替代文本JSON
五、最佳实践总结
- 一致性原则:编码解码使用相同的参数组合(如
ensure_ascii) - 安全防护:始终验证反序列化后的数据结构
- 性能考量:大数据场景优先选择C扩展库(如
orjson、ujson) - 版本兼容:处理外部API时明确指定JSON规范版本
- 日志记录:关键数据转换操作添加详细日志
通过系统掌握这些技术要点,开发者能够高效处理各类JSON数据场景,构建健壮的数据交换层。实际应用中可根据具体需求选择标准库或高性能替代方案,在开发效率与运行性能间取得最佳平衡。