为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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 75bb22b79cbf7335a4a6052f035901b162cc446f22841bb39479c6fb91e6bf10 |
|
MD5 | 233f08afa42a54a25ff144df41ee54f8 |
|
BLAKE2b-256 | 79d7e610d3f9a650562a36c1d7b77931061c2bc8226e752e8fa5d4874f315c4f |