当前位置:首页 > Python > 正文

Python JSON模块数据存储完全指南 | Python数据序列化教程

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格式化与美化

使用indentsort_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中处理数据的强大工具,掌握它能让你的程序更灵活、更强大!

发表评论