用于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第三方库


热门话题
带Maven的Eclipse Java存储库:缺少工件:compile   java如何以编程方式停止RMI服务器并通知所有客户端   java Roboguice抛出ClassNotFoundException:AnnotationDatabaseImpl   java为什么lucene 4.0删除IndexWriter类的两个构造函数?   nls如何避免java项目上不需要的日志消息?   测试无法在Selenium Webdriver(java)中定位iframe   使用XML的java servlet   java如何使用jxl用****屏蔽单元格   java使用SQLite从数据库中选择“没有这样的列”   导入扫描程序后出现java编译错误   插入查询的java空指针异常   使用创建PostgreSQL数据库。Java应用中的sql脚本   java使用jsoup将HTML解析为格式化的明文