对象的序列化与反序列化

1. JSON 概述:异构系统交换的“通行证”

在前面的章节中,我们学习了如何读写基础的文本和二进制文件。但在实际开发(如 Daoman Python AI 的后端通信)中,一个更现实的问题是:如何将内存中的列表(List)或字典(Dict)完整地保存到文件,并能被其他语言(如 JavaScript 或 Java)无损读取?

答案就是 JSON (JavaScript Object Notation)

JSON 最初是 JavaScript 中创建对象的字面量语法,但因其结构紧凑、纯文本、跨平台的特性,现已取代 XML 成为异构系统间交换数据的事实标准。无论是调用网络 API,还是存储模型配置文件,JSON 都是首选。

JavaScript 与 Python 的数据类型映射

JSON 的结构与 Python 字典极其相似,支持深层嵌套。以下是两种语言在处理 JSON 时的类型对应表:

表 1:JSON 类型 ➔ Python 类型

JSON 类型Python 类型说明
objectdict键值对映射
arraylist有序序列
stringstr字符串
numberint / float数值
booleanbooltrue/false 对应 True/False
nullNone空值

2. 读写 JSON 格式数据

Python 内置的 json 模块提供了强大的双向转换支持。我们需要掌握四个核心函数:

  • dump:将对象序列化并写入文件
  • dumps:将对象处理成 JSON 格式的字符串
  • load:从文件中读取并反序列化为对象。
  • loads:从字符串中解析并还原为对象。

实战演示:序列化与保存

import json

# 定义一个复杂的业务字典
my_dict = {
    'name': '道满',
    'age': 40,
    'friends': ['王大锤', '白元芳'],
    'cars': [
        {'brand': 'BMW', 'max_speed': 240},
        {'brand': 'Audi', 'max_speed': 280}
    ]
}

# 序列化为字符串 (用于日志打印或网络传输)
# indent=4 让输出带缩进,ensure_ascii=False 保证中文正常显示
json_str = json.dumps(my_dict, indent=4, ensure_ascii=False)
print(json_str)

# 序列化并写入文件 (持久化存储)
with open('data.json', 'w', encoding='utf-8') as file:
    json.dump(my_dict, file, ensure_ascii=False)

3. 包管理工具 pip 与性能优化

在处理 Kronos 项目等海量数据场景时,标准库 json 的性能可能成为瓶颈。此时,我们可以利用 Python 繁荣的生态圈,使用更高效的三方库 ujson

pip 核心操作指南

pip 是 Python 的包管理工具,用于安装、卸载和管理三方库。

  • 配置国内镜像(加速下载)
    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
  • 安装高性能库
    pip install ujson
  • 常用命令速查
    • pip list:查看已安装库。
    • pip install -U 库名:更新库。
    • pip uninstall 库名:删除库。

4. 实战:通过网络 API 获取实时数据

目前绝大多数的网络 API 都是基于 HTTP/HTTPS 协议返回 JSON 数据。在 Daoman Python AI 平台中,我们推荐使用简单且强大的 requests 库。

示例:获取国内实时新闻

(需先执行 pip install requests

import requests

# 这里的 APIKey 需要替换为您在天聚数行等平台申请的密钥
API_URL = 'http://api.tianapi.com/guonei/?key=YOUR_API_KEY&num=10'

resp = requests.get(API_URL)
if resp.status_code == 200:
    # 核心操作:直接将 HTTP 响应体反序列化为字典
    data_model = resp.json()
    for news in data_model.get('newslist', []):
        print(f"标题: {news['title']}")
        print(f"链接: {news['url']}")
        print('-' * 60)

5. 总结

  • 序列化:将内存对象转为可存储/传输的字节流(如 JSON 字符串)。
  • 反序列化:从字节流中提取并还原原始数据结构。
  • 掌握 JSON 处理是现代开发者的基本功,无论是前后端分离、微服务通信还是对接第三方 API,都离不开这一核心技术。