Skip to content

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不安全,不要加载不信任的数据!

练习 ​

  1. 配置文件:用JSON保存和读取程序配置。
  2. 自定义编码器:为自定义类实现JSON编码器。
  3. 数据导出:将Python对象列表导出为JSON文件。
  4. JSON vs pickle:比较两者的文件大小和兼容性。

答案:第三章答案

本章小结 ​

第三章学习了Python数据结构:对象引用、列表、元组、字典、集合、字符串、字节、正则、日期、JSON。

继续第四章学习类与对象协议。

回到第三章概览 · 返回Python学习路线

用心记录每一步成长