跳转到主要内容

为Python提供基本的类型编码/解码的JSON

项目描述

添加了对几个新的Python魔法方法的支持,以使Python面向对象的JSON编码和解码更容易,目标如下

  • jsonlight.dumps 应始终工作,即使它必须回退到字符串

  • 它检测正在转储的对象是否定义了 __jsondump__ 方法

  • 它检测正在转储的对象是否为全局typemap中定义的类型,或正在使用的类型

  • 为了实现完全往返,类型模式由您必须实现的 __jsonload__ 方法维护

标准类型

这是您在Python中可以做到的

from json import loads, dumps
from uuid import UUID, uuid4

obj = uuid4()
assert obj == UUID(loads(dumps(str(obj))))

所有标准Python类型,如UUID,必须在jsonlight提供的默认typemap中具有编码/解码方法,因此编码到JSON始终应该工作。然而,在加载时必须指定该类型

from jsonlight import loads, dumps
from uuid import UUID, uuid4

obj = uuid4()
assert obj == loads(UUID, dumps(obj))

您可以看到与 json.loads 的主要区别在于 jsonlight.loads 要求类型作为第一个参数。这是因为 jsonlight.loads 将首先调用 json.loads 将字符串转换为具有基本JSON类型的Python对象,然后将该对象传递给类型的 __jsonload__ 函数,如果有的话,则依赖typemap定义的函数。

嵌套类型

您可以根据以下约定使用 __jsondump____jsonload__ 方法

  • __jsondump__:返回一个具有 JSON 数据类型的 self 表示形式

  • __jsonload__:根据 __jsondump__ 的结果实例化一个对象

示例

from jsonlight import load

class YourClass:
    def __init__(self):
        self.now = datetime.now()

    def __jsondump__(self):
        return dict(now=self.now)

    @classmethod
    def __jsonload__(cls, data):
        return cls(load(datetime, data['now'])

正如您所看到的

  • 您不必担心在返回值上调用 __jsondump__,因为 jsonlight.dumps 会递归地这样做,

  • 您对反序列化的控制就像 __setstate__ 一样,但如果您在其中自己调用 jsonlight.load,那么您不需要在嵌套对象上重复反序列化逻辑,

类型映射

此库必须支持所有标准 Python 类型,并且它已经适用于像 UUID 或 Path 这样的类型,因为它们可以从字符串转换为字符串。然而,这种情况并不适用于 datetime,并且没有 JSON 标准适用于 datetime。

由于 jsonlight 支持所有标准 Python 类型是必需的,因此还包括了一个默认类型映射,它使 datetime 以 .isoformat() 的方式导出为字符串,并以 .fromisoformat() 的方式从字符串导入

now = datetime.now()
assert now == loads(datetime, dumps(now))

这就是为什么我们有类型映射的原因。jsonlight 中的类型映射将 Python 类型映射到一对编码/解码函数,这样我们就有了一些无需猴子补丁即可工作的东西。

为了说明如何使用特定的类型映射,让我们决定我们想要移除所有 Path 对象导出的前导斜杠,并在加载时确保有一个斜杠,我们将定义我们自己的类型映射

typemap = {
    Path: (
        lambda value: str(value).lstrip('/'),
        lambda data: Path('/' + data.lstrip('/')),
    ),
}
assert dumps(Path('/foo/bar'), typemap) == '"foo/bar"'
assert loads(Path, '"foo/bar"', typemap) == Path('/foo/bar')

还有一些可能性需要记住

  • typemap.update(jsonlight.typemap) 将默认 jsonlight 类型映射添加到您的自己的映射中,

  • jsonlight.typemap.update(typemap) 在默认类型映射之上添加您自己的类型映射。

项目详细信息


下载文件

下载您平台上的文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。

源分发

jsonlight-0.0.7.tar.gz (3.2 kB 查看哈希值)

上传时间

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面