用于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)在 默认类型映射。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何忽略缓冲读取器中在“”之后的行的其余部分,或行上的特定字符?   java在db中创建空对象或稍后保存   java如何实现UI无关的后台工作任务   java未能在Android中从BaseAdapter扩展的类中启动Tactivity?   java斐波那契迭代移动数组[]   安卓从文件读取提供了java。木卫一。StreamCorruptedException:无效的流标头:73720027   java计算矩形中的六边形数?   仅使用Java 1.5(或更早版本)读写XML   java如果所有元素都以相同的bucked结尾,为什么要进行大小调整?   java Apache POI Excel在xx中发现无法读取的内容。xlsx   swing我可以在普通java应用程序中使用GWTGUI吗?   来自自定义Java客户端的http删除请求的行为与邮递员不同   运行批处理文件时,java当前目录无效   使用TypeReference将java字符串转换为ArrayList<STRING>   documentlistener突出显示所有匹配词Java