用于Python的基本类型编码/解码的json
jsonlight的Python项目详细描述
添加了对两个新的Python魔术方法的支持,以使Python对象 面向JSON的编码和解码稍微容易一些,在 注意:
- 在jsonlight.dumps应该始终有效,即使它必须回退到字符串
- 它检测被转储的对象是否定义了__jsondump__方法
- 它检测要转储的对象是否属于全局中定义的类型 typemap,或者正在使用的那个
- 对于完整的往返,类型模式保存在 ^必须实现的{tt2}$方法
标准类型
这是您已经可以在Python中执行的操作:
fromjsonimportloads,dumpsfromuuidimportUUID,uuid4obj=uuid4()assertobj==UUID(loads(dumps(str(obj))))
所有标准Python类型(如UUID)都必须在 jsonlight提供的默认类型映射,因此对JSON的编码应该始终有效。 但是,必须在加载时指定类型:
^{pr2}$您可以看到与json.loads的主要区别是 jsonlight.loads需要一个类型作为第一个参数。这是因为 jsonlight.loads将首先调用json.loads,将字符串转换为 带有基本JSON类型的Python对象,然后将其传递给 __jsonload__函数。在
嵌套类型
您可以利用__jsondump__和__jsonload__方法,基于 以下惯例:
- __jsondump__:使用JSON数据类型返回self的表示
- __jsonload__:根据来自jsondump\uu的结果实例化一个对象
示例:
fromjsonlightimportloadclassYourClass:def__init__(self):self.now=datetime.now()def__jsondump__(self):returndict(now=self.now)@classmethoddef__jsonload__(cls,data):returncls(load(datetime,data['now'])
如您所见:
- 您不必担心在返回值时调用__jsondump__ 你自己的__jsondump__,因为jsonlight.dumps会做到这一点 递归地
- 您可以完全控制反序列化,就像使用__setstate__,但是 如果你打电话jsonlight.load公司你自己进去就不用了 嵌套对象上存在重复的反序列化逻辑
类型图
这个库必须支持所有标准的Python类型,并且它已经适用于 像UUID或Path是因为它们对字符串进行了精确的转换。然而, datetimes不是这样,datetimes也没有JSON标准。在
由于jsonlight需要支持所有标准python类型,因此 还包括默认的typemap,它使datetimes导出为字符串 .isoformat()和带有.fromisoformat()的字符串:
now=datetime.now()assertnow==loads(datetime,dumps(now))
这就是为什么我们有打字机。jsonlight中的typemap映射Python 输入两个编码/解码函数,这样我们就得到了 无需猴子修补即可工作。在
为了演示如何使用特定的类型映射,让我们决定删除 所有路径对象的前导斜杠将被转储,并确保加载时有一个 将定义我们自己的类型映射:
typemap={Path:(lambdavalue:str(value).lstrip('/'),lambdadata:Path('/'+data.lstrip('/')),),}assertdumps(Path('/foo/bar'),typemap)=='"foo/bar"'assertloads(Path,'"foo/bar"',typemap)
有几个可能性需要记住:
- typemap.update(jsonlight.typemap)将默认的jsonlight类型映射添加到 你自己的
- jsonlight.typemap.update(typemap)在 默认类型映射。在
- 项目
标签: