将python数据类序列化/反序列化为各种其他数据格式

dataclasses-serialization的Python项目详细描述


数据类序列化

dataclasses_serialization提供序列化器/反序列化器,用于在python数据类、json和bson对象之间进行转换。

基本用法

假设我们有以下数据类:

fromdataclassesimportdataclass@dataclassclassInventoryItem:name:strunit_price:floatquantity_on_hand:int

然后,我们可以使用JSONSerializer

将它序列化/反序列化到/从json。
>>> fromdataclasses_serialization.jsonimportJSONSerializer>>> JSONSerializer.serialize(InventoryItem("Apple",0.2,20)){'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}>>> JSONSerializer.deserialize(InventoryItem,{'name':'Apple','unit_price':0.2,'quantity_on_hand':20})InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)

蒙戈

由于mongo集合将对象存储为bson,因此可以使用BSONSerializer将数据类直接转储到mongo中。

fromdataclasses_serialization.bsonimportBSONSerializercollection.insert_one(BSONSerializer.serialize(item))item=BSONSerializer.deserialize(InventoryItem,collection.find_one())

自定义序列化程序

要创建自定义序列化程序,请创建dataclasses_serialization.serializer_base.Serializer

的实例
fromdataclasses_serialization.serializer_baseimportnoop_serialization,noop_deserialization,dict_serialization,dict_deserialization,list_deserialization,SerializerJSONSerializer=Serializer(serialization_functions={dict:lambdadct:dict_serialization(dct,key_serialization_func=JSONSerializer.serialize,value_serialization_func=JSONSerializer.serialize),list:lambdalst:list(map(JSONSerializer.serialize,lst)),(str,int,float,bool,type(None)):noop_serialization},deserialization_functions={dict:lambdacls,dct:dict_deserialization(cls,dct,key_deserialization_func=JSONSerializer.deserialize,value_deserialization_func=JSONSerializer.deserialize),list:lambdacls,lst:list_deserialization(cls,lst,deserialization_func=JSONSerializer.deserialize),(str,int,float,bool,type(None)):noop_deserialization})

参考

dataclasses_serialization.serializer_base

使创建序列化程序更容易的实用程序的集合。

  • isinstance(o, t)issubclass(cls, clsinfo)

    内置isinstanceissubclass的扩展版本,将dataclass视为数据类的元类,并可用于受支持的typing类型。

  • noop_serialization(obj)noop_deserialization(cls, obj)

    琐碎的序列化/反序列化函数,通过不执行任何操作进行序列化。

  • dict_to_dataclass(cls, dct, deserialization_func=noop_deserialization)

    dataclasses.asdict相反,它将字典dct反序列化为数据类cls,使用deserialization_func反序列化cls的字段。

    字段使用数据类提供的类型反序列化。 因此,绑定的泛型数据类可以反序列化,而未绑定的泛型数据类则不能反序列化。

  • union_deserialization(type_, obj, deserialization_func=noop_deserialization)

    反序列化一个Uniontype_,方法是依次尝试每个类型,并返回第一个不引发DeserializationError的类型。

    由于Optionals实现为Unions,此函数也适用于它们。

  • dict_serialization(obj, key_serialization_func=noop_serialization, value_serialization_func=noop_serialization)dict_deserialization(type_, obj, key_deserialization_func=noop_deserialization, value_deserialization_func=noop_deserialization)

    通过对键和值应用适当的序列化/反序列化函数来序列化/反序列化字典obj

  • list_deserialization(type_, obj, deserialization_func=noop_deserialization)

    通过对列表的值应用反序列化函数来反序列化列表obj

  • Serializer(serialization_functions, deserialization_functions)

    常规序列化类。

    获取序列化和反序列化函数的两个字典,并在通过serializedeserialize方法序列化/反序列化和对象时适当遵从它们。 序列化程序函数接受一个要序列化的对象参数,并返回其序列化版本。 反序列化程序函数接受两个参数,所需的反序列化对象类型和要反序列化的对象。

    默认情况下,dataclasses被序列化,就好像它们是dicts一样。 类似地,使用dict_to_dataclass反序列化dataclass,使用union_deserialization反序列化Union,使用自身作为嵌套的反序列化函数。

    使用serializer.serialize(obj)序列化python对象,并使用serializer.deserialize(cls, serialized_obj)反序列化。

    使用serializer.register_serializer(cls, func)serializer.register_deserializer(cls, func)serializer.register(cls, serialization_func, deserialization_func)注册更多序列化/反序列化函数。 它们也可以用作装饰器,如so:

    @serializer.register_serializer(int)defint_serializer(obj):...
    @serializer.register_deserializer(int)defint_deserializer(cls,obj):...
  • SerializationErrorDeserializationError

    分别在序列化/反序列化失败时引发的错误。

dataclasses_serialization.json

  • JSONSerializer

    python数据类和json对象之间的序列化器/反序列化器。

    >>> JSONSerializer.serialize(InventoryItem("Apple",0.2,20)){'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}>>> JSONSerializer.deserialize(InventoryItem,{'name':'Apple','unit_price':0.2,'quantity_on_hand':20})InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)
  • JSONSerializerMixin

    < P>在使用混合数据时,将^ {< CD50>}和^ {CD5>}方法添加到数据集中。

    @dataclassclassInventoryItem(JSONSerializerMixin):...
    >>> InventoryItem("Apple",0.2,20).as_json(){'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}>>> InventoryItem.from_json({'name':'Apple','unit_price':0.2,'quantity_on_hand':20})InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)
  • JSONStrSerializer

    python数据类和json字符串之间的序列化器/反序列化器。

    >>> JSONStrSerializer.serialize(InventoryItem("Apple",0.2,20))'{"name": "Apple", "unit_price": 0.2, "quantity_on_hand": 20}'>>> JSONStrSerializer.deserialize(InventoryItem,'{"name": "Apple", "unit_price": 0.2, "quantity_on_hand": 20}')InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)
  • JSONStrSerializerMixin

    当用作子项时,添加到“{”>“{”和“{”>“}”。

    @dataclassclassInventoryItem(JSONStrSerializerMixin):...
    >>> InventoryItem("Apple",0.2,20).as_json_str()'{"name": "Apple", "unit_price": 0.2, "quantity_on_hand": 20}'>>> InventoryItem.from_json_str('{"name": "Apple", "unit_price": 0.2, "quantity_on_hand": 20}')InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)

dataclasses_serialization.bson

  • BSONSerializer

    python数据类和bson对象之间的序列化器/反序列化器。

    >>> BSONSerializer.serialize(InventoryItem("Apple",0.2,20)){'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}>>> BSONSerializer.deserialize(InventoryItem,{'name':'Apple','unit_price':0.2,'quantity_on_hand':20})InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)
  • BSONSerializerMixin

    < P>在使用混合数据时,将^ ^ {CD59}和^ {CD60>}方法添加到数据集中。

    @dataclassclassInventoryItem(BSONSerializerMixin):...
    >>> InventoryItem("Apple",0.2,20).as_bson(){'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}>>> InventoryItem.from_bson({'name':'Apple','unit_price':0.2,'quantity_on_hand':20})InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)
  • BSONStrSerializer

    python数据类和二进制bson字符串之间的序列化程序/反序列化程序。

  • BSONStrSerializerMixin

    < P>在使用混合数据时,将^ {< CD6>}和^ {CD64 >}方法添加到数据集中。

    @dataclassclassInventoryItem(BSONStrSerializerMixin):...

安装

使用标准的python包管理器进行安装和更新pip

pip install dataclasses_serialization

欢迎加入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解析为格式化的明文