打包以封送和解组python对象

pymarshaler的Python项目详细描述


Pymarshaler-封送和解组Python对象

关于

Pymarshaler允许您将任何python对象直接封送到JSON格式的字符串或从JSON格式的字符串中解组。在

Pymarshaler利用了python新的typing support。通过读取类initparam类型,我们能够遍历嵌套的JSON结构并分配适当的值。在

基本用途

声明具有键入信息的类

classTest:def__init__(self,name:str):self.name=name

就这样!我们现在可以封送(更重要的是)将这个对象与JSON进行封送和解封。在

^{pr2}$

如果要直接从blob源代码解组,我们还使用marshal.unmarshal_str(cls, str)。在

这是一个非常简单的示例,让我们添加一个嵌套类

classStoresTest:def__int__(self,test:Test):self.test=teststores_test=StoresTest(Test('foo'))blob=marshal.marshal(stores_test)print(blob)>>>'{test: {name: foo}}'result=marshal.unmarshal(StoresTest,json.loads(blob))print(result.test.name)>>>'foo'

如您所见,添加嵌套类与添加基本结构一样简单。在

默认情况下,遇到未知字段时PyMarshaller将失败,但是您可以将其配置为忽略未知字段

frompymarshalerimportmarshalfrompymarshaler.arg_delegatesimportArgBuilderFactoryblob={'test':'foo','unused_field':'blah'}result=marshal.unmarshal(Test,blob)>>>'Found unknown field (unused_field: blah). If you would like to skip unknown fields set ArgBuilderFactory.ignore_unknown_fields(True)'ArgBuilderFactory.ignore_unknown_fields(True)result=marshal.unmarshal(Test,blob)print(result.name)>>>'foo'

高级用法

我们也可以使用pymarshaler来处理容器。我们再次利用python健壮的类型系统

frompymarshalerimportmarshalfromtypingimportSetimportjsonclassTestContainer:def__int__(self,container:Set[str]):self.container=containercontainer_instance=TestContainer({'foo','bar'})blob=marshal.marshal(container_instance)print(blob)>>>'{container: ["foo", "bar"]}'result=marshal.unmarshal(TestContainer,json.loads(blob))print(result.container)>>>'{foo, bar}'

pymarshaller还可以处理存储用户定义类型的容器。Set[str]很容易就是Set[UserDefinedType]

pymarshaller还支持默认值,如果JSON数据中没有这些值,那么它将使用__init__中提供的任何默认值。在

frompymarshalerimportmarshalclassTestWithDefault:def__init__(self,name:str='foo'):self.name=nameresult=marshal.unmarshal(TestWithDefault,{})print(result.name)>>>'foo'

如果没有给定任何非默认属性,Pymarshaler将引发一个错误

Pymarshaler还支持在创建python对象时使用validate方法。此方法将在返回给用户之前调用。在

frompymarshalerimportmarshalclassTestWithValidate:def__init__(self,name:str):self.name=namedefvalidate(self):print(f'My name is {self.name}!')result=marshal.unmarshal(TestWithValidate,{'name':'foo'})>>>'My name is foo!'

这可以用于在构造时验证python对象,如果任何字段的值无效,则可能会引发错误

还可以为特定的用户定义类注册自己的自定义解组器。在

frompymarshaler.arg_delegatesimportArgBuilderDelegate,ArgBuilderFactoryfrompymarshalerimportmarshalclassClassWithMessage:def__init__(self,message:str):self.message=messageclassClassWithCustomDelegate:def__init__(self,message_obj:ClassWithMessage):self.message_obj=message_objclassCustomDelegate(ArgBuilderDelegate):def__init__(self,cls):super().__init__(cls)defresolve(self,data):return{'message_obj':ClassWithMessage(data['message'])}ArgBuilderFactory.register_delegate(ClassWithCustomDelegate,CustomDelegate)result=marshal.unmarshal(ClassWithCustomDelegate,{'message':'Hello from the custom delegate!'})print(result.message_obj)>>>'Hello from the custom delegate!'

任何委托的结果都应该是字典,但是返回字典中的任何数据都应该是它们的类形式。在

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

推荐PyPI第三方库


热门话题
java Jsonify使用Jackson来定义嵌套对象   在Swing中禁用java图形调试   java Selenium Webdriver拖放在Jenkins上不起作用   java我对一个显示器的问题有一个非常不切实际的询问   java增强的“for”循环导致ArrayIndexOutOfBoundsException   ArrayAdapter适用于Java中的安卓编程,字符串数组   linux在Ubuntu上通过PulseAudio播放Java音频文件时出错   java在Spring应用程序中加载内部(类路径)和外部属性文件   java使用Maven连接到mySQL   Java应用程序的设计   websocket在电报api java中与dc的连接   java XMLStreamException,因为xml中的(&N)   java从控制台输出到JTextArea   Java导出文本文件   java实现parseInt方法   java为什么servlet容器会同步对特定资源/servlet的多个请求的访问?   循环中的Java“while”变量   用Java编程一个国际象棋游戏,gameOver布尔不起作用   java如何获得真正的JPanel大小?