Use Dialects to handle different data formats
masterA Dialect allows you to define specific serialization and deserialization behaviors (like date formats or field naming) for a single dataclass without creating multiple dataclass definitions. This is useful when interacting with different APIs that require different data representations.
To use a dialect:
- Create a class inheriting from
Dialect. - Override options like
serialization_strategy,serialize_by_alias,omit_none,omit_default,namedtuple_as_dict, orno_copy_collections. - Pass the dialect to
to_dict(dialect=...)orfrom_dict(..., dialect=...). - Alternatively, set a
dialectin yourBaseConfigto make it the default for that dataclass.
Note: To use dialects, you must include ADD_DIALECT_SUPPORT in your code_generation_options within your config.
from dataclasses import dataclass
from datetime import date, datetime
from mashumaro import DataClassDictMixin
from mashumaro.config import ADD_DIALECT_SUPPORT
from mashumaro.dialect import Dialect
from mashumaro.types import SerializationStrategy
class DateTimeSerializationStrategy(SerializationStrategy):
def __init__(self, fmt: str):
self.fmt = fmt
def serialize(self, value: date) -> str:
return value.strftime(self.fmt)
def deserialize(self, value: str) -> date:
return datetime.strptime(value, self.fmt).date()
class EthiopianDialect(Dialect):
serialization_strategy = {
date: DateTimeSerializationStrategy("%d/%m/%Y")
}
class JapaneseDialect(Dialect):
serialization_strategy = {
date: DateTimeSerializationStrategy("%Y年%m月%d日")
}
@dataclass
class Entity(DataClassDictMixin):
dt: date
class Config:
code_generation_options = [ADD_DIALECT_SUPPORT]
entity = Entity(date(2021, 12, 31))
entity.to_dict(dialect=EthiopianDialect) # {'dt': '31/12/2021'}
entity.to_dict(dialect=JapaneseDialect) # {'dt': '2021年12月31日'}
Entity.from_dict({'dt': '2021年12月31日'}, dialect=JapaneseDialect)