JSON与序列化:保存数据时会丢掉什么
JSON基础
python
import json
# Python对象转JSON字符串
data = {'name': 'Alice', 'age': 30, 'skills': ['Python', 'SQL']}
json_str = json.dumps(data, indent=2)
print(json_str)
# JSON字符串转Python对象
parsed = json.loads(json_str)
print(parsed['name']) # 'Alice'文件读写
python
# 写入文件
with open('data.json', 'w') as f:
json.dump(data, f, indent=2)
# 从文件读取
with open('data.json', 'r') as f:
loaded = json.load(f)JSON支持的类型
支持:dict, list, str, int, float, bool, None
不支持:tuple, set, datetime, 自定义对象
python
# tuple会变成list
print(json.dumps((1, 2, 3))) # "[1, 2, 3]"
# 自定义对象需要转换
from datetime import datetime
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
data = {'time': datetime.now()}
json_str = json.dumps(data, cls=DateTimeEncoder)pickle:Python专用序列化
python
import pickle
data = {'set': {1, 2, 3}, 'tuple': (4, 5)}
# 序列化
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
# 反序列化
with open('data.pkl', 'rb') as f:
loaded = pickle.load(f)警告:pickle不安全,不要加载不信任的数据!
练习
- 配置文件:用JSON保存和读取程序配置。
- 自定义编码器:为自定义类实现JSON编码器。
- 数据导出:将Python对象列表导出为JSON文件。
- JSON vs pickle:比较两者的文件大小和兼容性。
答案:第三章答案
本章小结
第三章学习了Python数据结构:对象引用、列表、元组、字典、集合、字符串、字节、正则、日期、JSON。
继续第四章学习类与对象协议。
回到第三章概览 · 返回Python学习路线