使用json序列化不受支持的python类型(还有更多类型,包括函数、类、异常等)。[稳定-PY2-PY3]。
lambdaJSON的Python项目详细描述
lambdajson
使用json序列化python标准类型(函数、元组、类、memoryView、set、frozenset、异常、complex、range、bytes、bytearray、dict和数字键、byte键或元组键等)。 lambdajson允许您使用json序列化python标准库对象。
V0.4.0变化
此版本与以前的版本不兼容。我用marshal冻结函数,这样更好,这样我们就有了更干净的代码。
V0.3.0变化
代码更干净,我使用类和函数定义而不是lambda来提高可读性。 现在,有一个lambdajson类,即freezer和defreezer类,您可以拥有尽可能多的自定义lambdajson实例。 方法标识符已更改。以前我用的是“type://”标识符,这是不干净的,序列化后它变成了“type:\/\/”这是难看的,现在我用的是“type::”标识符。
我添加了一个方法类,您可以使用它为复杂/自定义数据类型实现自定义冻结和解冻方法。
不能再向loads函数传递globals,必须在向其传递globals函数的同时创建lambdajson实例。 有关更多信息,请参见示例。
我已经重新设计了lambdajson,我不知道哪些部分还需要做一些工作,给我发邮件或者发布一个问题如果你找到了,我很乐意解决它。
示例
**从v0.2.19开始,您可以使用转储、加载而不是序列化、反序列化。**
典型用法:
#!/usr/bin/env python >>> import lambdaJSON >>> myComplexData = {True: (3-5j), (3+5j): b'json', (1, 2, 3): {b'lambda': [1, 2, 3, (3, 4, 5)]}} >>> mySerializedData = lambdaJSON.serialize(myComplexData) >>> myComplexData == lambdaJSON.deserialize(mySerializedData) True >>>
要将args和kwargs传递给编码器/解码器,只需将它们传递给serialize/deserialize函数,例如json:
>>> mySerializedData = lambdaJSON.serialize(myComplexData, sort_keys = True) >>> myComplexData == lambdaJSON.deserialize(mySerializedData, object_hook = my_hook)
UJSON也可以这样做。您还可以序列化python函数:
>>> import lambdaJSON >>> def f(): print('lambdaJSON Rocks!') >>> mySerializedFunction = lambdaJSON.serialize(f) >>> myNewFunction = lambdaJSON.deserialize(mySerializedFunction) >>> myNewFunction() 'lambdaJSON Rocks!' >>>
您不能再传递globals来反序列化/转储方法,因此以下代码将不起作用:
>>> import lambdaJSON >>> y = 10 >>> def f(x): return x*y >>> mySerializedFunction = lambdaJSON.serialize(f) >>> myNewFunction = lambdaJSON.deserialize(mySerializedFunction, globs = (lambda: globals())) >>> myNewFunction(5) 50 >>> y = 3 >>> myNewFunction(5) 15 >>>
相反,您可以这样做:
>>> from lambdaJSON import lambdaJSON >>> lj = lambdaJSON(globs = (lambda: globals())) >>> y = 10 >>> def f(x): return x*y >>> mySerializedFunction = lj.dumps(f) >>> myNewFunction = lj.loads(mySerializedFunction) >>> myNewFunction(5) 50 >>> y = 3 >>> myNewFunction(5) 15 >>>
*这在0.4.0版中不起作用* 如果没有globs传递给类实例,globs将只是内置模块。请注意,传递globals将传递lambdajsons本地globals,如果要包含调用反序列化函数的所有globals,只需使用globs=(lambda:globals()),否则将实现自己的函数。你也可以做一些不错的黑客:
>>> z = 10 >>> def g(): global z z += 1 return {'z':z} >>> def f(x,y): return x*y+z >>> from lambdaJSON import lambdaJSON >>> lj = lambdaJSON(globs = g) >>> mySerializedFunction = lj.dumps(f) >>> myNewFunction = lj.loads(mySerializedFunction) >>> myNewFunction(2,3) 17 >>> myNewFunction(2,3) 18 >>>
在0.4.0版本中,该函数是作为一个真正的python函数创建的,而不是lambda hack,因此您不能再做类似的事情。
您可以将内置异常序列化如下:
>>> a = lambdaJSON.serialize(OSError('FILE NOT FOUND')) >>> b = lambdaJSON.deserialize(a) >>> raise b Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> raise b OSError: FILE NOT FOUND >>>
在0.2.15版本中引入,现在可以序列化基本类和类型。支持是基本的,但是我计划在下一个subversion中开发类序列化支持。若要反序列化类,还必须传递globals函数,如果不传递globals,则只会将内置函数传递给类函数。这是一个这样做的示例:
>>> class test(object): def __init__(self): self.var = 'lambdaJSON' >>> serializedClass = lambdaJSON.serialize(test) >>> newClass = lambdaJSON.deserialize(serializedClass) >>> newClass().var 'lambdaJSON' >>>
要检查版本,只需使用lambdajson.\uu version,或者如果您想知道正在使用哪个json库,请尝试lambdajson.\uu json.\u
实施自己的方法
实现自己的方法与lambdajson一起使用非常简单,您可以使用lambdajson.addmethod函数:
>>> from lambdaJSON import lambdaJSON >>> lj = lambdaJSON() #No globals passed, using globs = (lambda: globals()) >>> lj.addMethod(name, type, freezer, defreezer)
名称必须是str类型,并且是唯一的,不要使用诸如tuple、str、complex等内置类型的名称… 类型是要为其添加方法的类型。它必须是一种类型。 冷冻器和解冻器都是函数,冷冻器必须返回str,解冻器必须接收str并将其返回到初始对象。 两个函数都应该有obj关键字:
>>> def myFreezer(obj, lj): #lj is the lambdaJSON instance calling this function #do something and return a string. >>> def myDefreezer(obj, lj): #get the string and defreeze it.
浏览源代码以获取更多信息。
json库
lambdajson首先尝试导入ujson,如果失败,它将导入simplejson,如果失败,json库将被导入。您可以检查哪个json库正在使用w与lambdajson.
当前支持的类型
此版本中涵盖了这些类型:
- 功能
- 字节和字节数组
- 课程(基本支持)
- 内置异常
- 元组
- 复杂
- 范围
- 设置并冻结设置
- 记忆视图
- dicts(带数字、元组、字符串、bool和字节键)
- 其他支持json的类型
以前的变化
更好地支持类序列化。
项目信息
Github项目页:https://github.com/pooya-eghbali/lambdaJSON 请发邮件至:persian.writer[网址]gmail.com
如果有任何问题或您有功能要求,请与我联系。您还可以在github上发布问题。