打包以封送和解组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!'
任何委托的结果都应该是字典,但是返回字典中的任何数据都应该是它们的类形式。在
- 项目
标签: