上一篇
Python JSON模块数据存储完全指南 | Python数据序列化教程
- Python
- 2025-08-17
- 1996
Python JSON模块数据存储完全指南
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Python的json
模块提供了一种简单的方法来编码和解码JSON数据。
1. JSON模块基础
Python的json
模块是标准库的一部分,无需额外安装即可使用。它提供了两个主要功能:
- 序列化(编码):将Python对象转换为JSON字符串
- 反序列化(解码):将JSON字符串转换回Python对象
Python与JSON数据类型对应关系
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
2. 数据转换:Python ↔ JSON
使用json.dumps()
将Python对象转换为JSON字符串,使用json.loads()
将JSON字符串转换为Python对象。
基础转换示例
import json
# Python对象转换为JSON字符串
data = {
"name": "张三",
"age": 30,
"married": True,
"children": ["小明", "小红"],
"pets": None
}
json_string = json.dumps(data, ensure_ascii=False, indent=4)
print("JSON字符串:")
print(json_string)
# JSON字符串转换为Python对象
python_obj = json.loads(json_string)
print("\n转换回Python对象:")
print(python_obj)
print("姓名:", python_obj["name"])
参数说明
ensure_ascii=False
:允许非ASCII字符(如中文)直接显示indent=4
:设置缩进,使JSON更易读sort_keys=True
:按键名排序输出separators=(',', ':')
:自定义分隔符
3. 读写JSON文件
使用json.dump()
将数据写入JSON文件,使用json.load()
从JSON文件读取数据。
文件读写示例
import json
# 要存储的数据
users = [
{"id": 1, "name": "张三", "email": "zhangsan@example.com"},
{"id": 2, "name": "李四", "email": "lisi@example.com"},
{"id": 3, "name": "王五", "email": "wangwu@example.com"}
]
# 写入JSON文件
with open('users.json', 'w', encoding='utf-8') as file:
json.dump(users, file, ensure_ascii=False, indent=4)
print("数据已写入 users.json 文件")
# 从JSON文件读取
with open('users.json', 'r', encoding='utf-8') as file:
loaded_users = json.load(file)
print("\n从文件读取的数据:")
for user in loaded_users:
print(f"{user['id']}: {user['name']} - {user['email']}")
写入文件注意事项
- 使用
with
语句确保文件正确关闭 - 指定
encoding='utf-8'
支持中文 indent
参数使文件更易读- 考虑添加
.json
文件扩展名
读取文件注意事项
- 处理文件不存在异常(FileNotFoundError)
- 处理JSON解码错误(json.JSONDecodeError)
- 验证读取数据的完整性
- 考虑使用
try-except
处理错误
4. 高级JSON技巧
自定义对象序列化
import json
from datetime import datetime
class User:
def __init__(self, name, email, join_date):
self.name = name
self.email = email
self.join_date = join_date
# 自定义编码器
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, User):
return {
"name": obj.name,
"email": obj.email,
"join_date": obj.join_date.strftime("%Y-%m-%d")
}
elif isinstance(obj, datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S")
return super().default(obj)
# 创建对象
user = User("张三", "zhangsan@example.com", datetime.now())
# 序列化自定义对象
user_json = json.dumps(user, cls=CustomEncoder, indent=2)
print(user_json)
处理日期时间
JSON没有内置的日期类型,通常将日期转换为字符串:
from datetime import datetime
# 日期转字符串
now = datetime.now()
date_str = now.isoformat()
# 字符串转日期
date_obj = datetime.fromisoformat(date_str)
JSON格式化与美化
使用indent
和sort_keys
参数:
# 美化JSON输出
pretty_json = json.dumps(data,
indent=4,
sort_keys=True,
ensure_ascii=False)
5. 实际应用示例
配置系统实现
import json
import os
class ConfigManager:
def __init__(self, config_file='config.json'):
self.config_file = config_file
self.config = self.load_config()
def load_config(self):
"""加载配置文件"""
if os.path.exists(self.config_file):
try:
with open(self.config_file, 'r') as file:
return json.load(file)
except (FileNotFoundError, json.JSONDecodeError):
# 文件不存在或格式错误时返回默认配置
return self.get_default_config()
return self.get_default_config()
def save_config(self):
"""保存配置文件"""
with open(self.config_file, 'w') as file:
json.dump(self.config, file, indent=4)
def get_default_config(self):
"""返回默认配置"""
return {
"theme": "light",
"language": "zh-CN",
"font_size": 14,
"auto_save": True,
"recent_files": []
}
def get(self, key, default=None):
"""获取配置项"""
return self.config.get(key, default)
def set(self, key, value):
"""设置配置项"""
self.config[key] = value
self.save_config()
# 使用示例
if __name__ == "__main__":
config = ConfigManager()
# 获取配置
print("当前主题:", config.get("theme"))
# 修改配置
config.set("font_size", 16)
config.set("recent_files", ["file1.py", "data.json"])
print("配置已更新并保存")
6. 总结与最佳实践
JSON使用最佳实践
- 始终处理异常:捕获JSON解析和文件操作中的异常
- 验证数据:在反序列化后验证数据的完整性和结构
- 使用UTF-8编码:确保正确处理多语言字符
- 敏感数据不存储:避免在JSON中存储密码等敏感信息
- 考虑性能:对于大型数据集,考虑流式处理或更高效的格式
- 版本控制:为配置文件添加版本号以便未来迁移
何时使用JSON?
- 配置文件存储
- Web API数据交换
- 简单数据持久化
- 程序间数据传递
- 需要人类可读格式的场景
JSON是Python中处理数据的强大工具,掌握它能让你的程序更灵活、更强大!
本文由DongfangNuoLin于2025-08-17发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20258369.html
发表评论