Simple aliasing for dataclass working with orjson and ormsgpack
- Default
from dataclass_alias import AliasedDataclasses, asdict
from dataclasses import field, dataclass
@dataclass
class Data(metaclass=AliasedDataclasses, override_by_alias=True):
my_field: str = field(metadata={"alias": "myField"})
instance = Data(my_field="field")
instance2 = Data(myField="field") # or Data(**{"myField": "field"})
as_dict = asdict(instance2)
print(as_dict)
# Output: {"myField": "field"}
- override_by_alias with False
from dataclass_alias import AliasedDataclasses, asdict, alias
from dataclasses import field, dataclass
@dataclass
class Data(metaclass=AliasedDataclasses):
my_field: str = field(metadata={"alias": "myField"})
instance2 = Data(myField="field") # or Data(**{"myField": "field"})
as_dict = asdict(instance2)
print(as_dict)
# Output: {"my_field": "field"}
with alias(instance2):
as_dict = asdict(instance2)
print(as_dict)
# Output: {"myField": "field"}
as_dict = asdict(instance2)
print(as_dict)
# Output: {"my_field": "field"}
- With override_factory
Remember that if you use alias
in metadate this alias will override alias from alias_factory
from dataclass_alias import AliasedDataclasses, asdict
from dataclasses import field, dataclass
def to_lower_camel(string: str) -> str:
if len(string) >= 1:
pascal_string = ''.join(word.capitalize() for word in string.split('_'))
return pascal_string[0].lower() + pascal_string[1:]
return string.lower()
@dataclass
class Data(metaclass=AliasedDataclasses, alias_factory=to_lower_camel, override_by_alias=True):
my_field: str = field(metadata={"alias": "MyField"})
my_other_field: str
instance2 = Data(my_field="field", my_other_field="other_field") # or Data(**{"MyField": "field"})
as_dict = asdict(instance2)
print(as_dict)
# Output: {"MyField": "field", "myOtherField": "other_field"}
- Working with other serialize libraries
This implementation will work with libraries as orjson, ormsgpack
import orjson
from dataclass_alias import AliasedDataclasses, asdict
from dataclasses import field, dataclass
@dataclass
class Data(metaclass=AliasedDataclasses, override_by_alias=True):
my_field: str = field(metadata={"alias": "myField"})
instance = Data(my_field="field")
instance2 = Data(myField="field") # or Data(**{"myField": "field"})
dump = orjson.dumps(instance2)
print(dump)
# Output: b'{"myField":"field"}'
- Inheritance
from dataclass_alias import AliasedDataclasses, asdict
from dataclasses import field, dataclass
@dataclass
class BaseAlias(metaclass=AliasedDataclasses, override_by_alias=True):
...
@dataclass
class Data(BaseAlias):
my_field: str = field(metadata={"alias": "myField"})
@dataclass
class DataChild(Data):
my_other_field: str = field(metadata={"alias": "myOtherField"})
instance = DataChild(my_field="field", my_other_field="other_field")
as_dict = asdict(instance)
print(as_dict)
# Output: {"myField": "field", "myOtherField": "other_field"}