Python JSON 与 Pickle 的使用边界

星杰小哥_3667

星杰小哥_3667

2026-02-18

435人浏览

原创

该用 json.dumps() 时:数据结构简单且需跨语言或人工可读;否则用 pickle.dump()。JSON 不支持 datetime 等类型,pickle 可存任意 Python 对象但不安全、不可跨语言。

python json 与 pickle 的使用边界

什么时候该用 json.dumps(),而不是 pickle.dump()

JSON 是跨语言、可读、安全的序列化格式;Pickle 是 Python 专属、可存任意对象、但有执行风险。选 JSON 的前提是:数据结构简单(dict、list、str、int、float、bool、None),且需要被其他语言读取或人工查看。

  • 遇到 TypeError: Object of type X is not JSON serializable,说明你试图序列化 datetime、set、自定义类实例等 —— 这是 JSON 的硬限制,不是写法问题
  • 如果只是临时存 Python 进程间数据(比如缓存函数结果),又含 numpy.ndarray 或带方法的对象,pickle 是更直接的选择
  • json 默认不保留顺序(Python 3.7+ dict 有序,但 json 不保证输出顺序);pickle 完全保留对象状态,包括私有属性和内存地址相关行为(如循环引用)

json.load() 报 JSONDecodeError: Expecting value 怎么快速定位

这个错误几乎都来自输入内容为空、只有空白符,或混入了 BOM、注释、非 UTF-8 字节 —— JSON 标准不允许这些。

  • 先用 open(file, "rb").read() 看前 20 字节,确认有没有 b"\xef\xbb\xbf"(UTF-8 BOM);有就改用 encoding="utf-8-sig"
  • 别直接 json.load(f),先 f.read().strip(),空字符串就跳过,避免把日志文件末尾的空行当 JSON 解析
  • 浏览器或 curl 保存的响应体可能含 HTML 标签或重定向提示,用 filetype 库或简单检查是否以 { 或 [ 开头

pickle 反序列化时为什么有时能跑,有时报 AttributeError: Can't get attribute 'X' on

这是 pickle 的模块绑定机制导致的:它只存类名和模块路径,反序列化时会尝试从当前运行环境的 __main__ 或对应模块里重新导入该类。一旦类定义位置变了,就找不到。

Python Dependency Candidate Fetcher 2
Python Dependency Candidate Fetcher 2

根据包的能力以及 Jupyter 环境中的导入语句,从候选列表中挑选最适合用户表格工作流的 Python 包。

下载
  • 把要 pickle 的类定义在独立 `.py` 文件中(比如 models.py),不要放在脚本顶层或 Jupyter cell 里
  • 避免用 lambda、嵌套函数、functools.partial 等动态生成的对象 —— 它们没有稳定模块路径
  • 生产环境慎用 pickle 做持久化存储;升级代码后旧 pickle 文件大概率失效,比数据库迁移还难处理

性能和大小:JSON 和 Pickle 在大数据量下到底差多少

实测 10 万条 {"id": int, "name": str, "score": float} 的字典列表,json.dumps() 比 pickle.dumps(..., protocol=4) 慢约 1.5–2 倍,体积大 30%–50%,但差异随数据嵌套深度增加而收窄。

  • pickle 的 protocol=5(Python 3.8+)支持缓冲区零拷贝,对大 bytes 或 array.array 有明显优势;JSON 始终走字符串编码
  • 如果数据含大量重复 key(如日志字段固定),用 ujson 或 orjson 可提速 3–5 倍,但它们不兼容所有 JSON 标准(比如 orjson 不支持 default 参数)
  • 别为了省几 MB 自动切到 pickle —— 调试成本、跨环境风险、长期可维护性损失远高于磁盘开销

真正麻烦的从来不是选哪个函数,而是同一个项目里混用两种序列化方式:比如用 JSON 存配置、Pickle 存缓存,结果某天有人把缓存文件误当配置加载,或者用 json.loads() 去读 pickle 二进制 —— 错误信息不会告诉你“你读错了格式”,只会抛一堆字节解码异常。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python js json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2235

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3582

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1196

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4119

7

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

2024.04.28

7187

8

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

2025.10.23

844

4

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

2023.06.14

3803

6

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

2023.10.30

895

4

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1838

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习