使用json序列化不受支持的python类型(还有更多类型,包括函数、类、异常等)。[稳定-PY2-PY3]。

lambdaJSON的Python项目详细描述


Latest PyPI versionNumber of PyPI downloadsLicense LGPLPackage is stableNumber of PyPI downloads

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.

当前支持的类型

此版本中涵盖了这些类型:

  1. 功能
  2. 字节和字节数组
  3. 课程(基本支持)
  4. 内置异常
  5. 元组
  6. 复杂
  7. 范围
  8. 设置并冻结设置
  9. 记忆视图
  10. dicts(带数字、元组、字符串、bool和字节键)
  11. 其他支持json的类型

以前的变化

更好地支持类序列化。

项目信息

Github项目页:https://github.com/pooya-eghbali/lambdaJSON 请发邮件至:persian.writer[网址]gmail.com

如果有任何问题或您有功能要求,请与我联系。您还可以在github上发布问题。

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

推荐PyPI第三方库


热门话题
面向java语句的方法与面向表达式的方法   密码学如何在java中为json对象签名?   是否可以通过java程序知道给定卡夫卡消费群体的消费偏移量?   打印字符时出现java未知问号   java为JFrame设置背景色   在ubuntu中检查java版本时linux权限被拒绝   如何用java创建xml模式   java无法在远程服务器上运行Vaadin应用程序   java智能垃圾收集?   java如何在SpringMVC中设置缓存头?   在unix计算机上运行java应用程序a:>签名以输入内容   Java、Apache Commons配置XML属性   使用ArrayList调用Java未经检查的方法   在文本文件中查找并替换单词(Java GUI)   java Android Studio无法检测到JDK7或更新版本   java从socket的有效负载获取事件消息   安卓中java调用子类方法   java如何通过点击超链接来运行jar文件(Firefox)