一、JSON 基础操作
一、基础核心操作
1. 字典转JSON字符串
使用内置json.dumps()
方法实现类型转换,支持多种参数优化:
import json
data = {"name": "Yant", "age": 25, "skills": ["Python", "数据分析"]}# 基础转换
json_str = json.dumps(data)
# 优化显示(含中文支持+格式化)
formatted_str = json.dumps(data, ensure_ascii=False, indent=4)
print(formatted_str)
参数说明:
ensure_ascii=False
禁用ASCII
编码保留中文原貌indent=4
生成带缩进的美观格式
结果输出
{"name": "Yant","age": 25,"skills": ["Python","数据分析"]
}
2. 字典转JSON文件
通过json.dump()
实现持久化存储:
with open('user.json', 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=4)print(f.name)
文件操作建议指定utf-8
编码以避免乱码
3. JSON文件转字典
使用json.load()
反向解析文件内容:
with open('user.json', 'r', encoding='utf-8') as f:loaded_data = json.load(f)
print(loaded_data['name']) # 输出:Yant
4. JSON字符串转字典
通过json.loads()
实现内存数据转换:
json_str = '{"city": "北京", "population": 2154}'
parsed_dict = json.loads(json_str)
print(type(parsed_dict)) # <class 'dict'>
二、进阶处理技巧
1. 复杂对象序列化
处理自定义类实例时扩展序列化方法:
import json
from datetime import datetimeclass User:def __init__(self, name, join_date):self.name = nameself.join_date = join_date # datetime对象def custom_encoder(obj):if isinstance(obj, User):return {"name": obj.name, "date": obj.join_date.isoformat()}raise TypeErroruser = User("Yant", datetime.now())
json_str = json.dumps(user, default=custom_encoder)
print(json_str)
2. 异常处理机制
try:json.loads('{"invalid": data}')
except json.JSONDecodeError as e:print(f"错误位置:{e.pos},错误信息:{e.msg}")## 异常输出
错误位置:12,错误信息:Expecting value
三、第三方库横向评测
库名称 | 安装命令 | 速度 | 特点 | 适用场景 |
---|---|---|---|---|
orjson | pip install orjson | ⚡️最快 | 支持datetime类型,输出为字节流 | 大数据量/高频处理 |
ujson | pip install ujson | 🚀快 | 兼容性好,接口与标准库一致 | 常规场景替代方案 |
rapidjson | pip install python-rapidjson | 🏃♂️较快 | 支持SAX/DOM解析模式 | 流式数据处理 |
simplejson | pip install simplejson | 🐢一般 | 支持旧版Python,功能最接近标准库 | 兼容性要求高环境 |
性能实测数据(处理10MB JSON):
orjson
:序列化0.2s / 反序列化0.3sujson
:序列化0.5s / 反序列化0.6sjson
:序列化2.1s / 反序列化1.8s
四、选型决策树
- 基础需求 ➔ 内置
json
模块 - 高频大数据处理 ➔
orjson
(需处理字节转换) - 平衡需求 ➔
ujson
(兼容性好)或rapidjson
(流式处理) - 历史项目维护 ➔
simplejson
(支持Python 2.x)
五、避坑指南
- 键名引号规范:JSON强制使用双引号,单引号会引发解析错误
- 浮点精度问题:建议使用
decimal.Decimal
处理财务数据 - 循环引用检测:自定义序列化时注意对象引用关系
- 时区处理:建议统一转换为UTC时间存储