jsonpickle:Python 对象与 JSON 的双向转换

0 阅读2分钟

jsonpickle:Python 对象与 JSON 的双向转换

jsonpickle 在 GitHub 上拿到了 1,317 个 Star。

这是一个 Python 库,干一件事:把复杂的 Python 对象转成 JSON,也能把 JSON 转回 Python 对象。它基于 Python 标准库的 json 模块,但处理的是普通 json 搞不定的自定义类、嵌套对象这些数据结构。

正文顶部截图

1、 这玩意儿是干嘛的

Python 的 json 模块只能处理基础类型:字符串、数字、列表、字典。遇到自定义类、日期对象、嵌套实例,直接报错。

jsonpickle 把这个缺口补上了。它通过添加类型元数据,让 JSON 字符串能完整记录原始对象的类型信息,解码时再按这个信息重建对象。

比如一个 dataclass 实例:

import jsonpickle
from dataclasses import dataclass

@dataclass
class Example:
    data: str

ex = Example("value1")
encoded = jsonpickle.encode(ex)

编码结果是:

{"py/object": "__main__.Example", "data": "value1"}

解码时直接还原成原来的实例,属性一个不少。

2、 跟 pickle 有什么区别

Python 自带的 pickle 也能序列化对象,但有两个问题。

第一,pickle 出来的数据是二进制格式,人读不了,跨语言也读不了。jsonpickle 输出的是纯 JSON,任何支持 JSON 的平台都能解析。

第二,pickle 在反序列化时会执行任意 Python 代码,这也是它的安全硬伤。jsonpickle 也一样存在这个风险,只建议处理可信来源的数据。

如果你的场景需要人可读、跨平台、或者数据要存到 S3 这类支持 JSON 索引的服务里,jsonpickle 比 pickle 更合适。

README区域截图

3、 扩展支持

jsonpickle 对 numpy 数组和 pandas DataFrame 有内置扩展。使用前注册一下:

import jsonpickle.ext.numpy as jsonpickle_numpy
import jsonpickle.ext.pandas as jsonpickle_pandas

jsonpickle_numpy.register_handlers()
jsonpickle_pandas.register_handlers()

注册后就能直接序列化这些科学计算对象了。

4、 安装

直接从 PyPI 安装:

pip install jsonpickle

这个库除了 Python 标准库之外零依赖,体积很小。

5、 适合哪些场景

  • 需要把 Python 对象持久化成可读格式的项目
  • 数据要在 Python 和其他语言之间流转的接口
  • 使用自定义类存储配置或状态,需要序列化保存的情况
  • 处理 numpy、pandas 数据并需要 JSON 输出的数据管道