It is often useful to be able to control how objects are encoded to and decoded from JSON. Quart makes this possible via the json_encoder and json_decoder to a custom JSONEncoder and JSONDecoder. This can be done for all routes via the Quart or for blueprint specific routes via json_encoder and json_decoder.
json_encoder
json_decoder
Quart
As an example lets consider a Money object,
class Money: def __init__(self, amount: Decimal, currency: str) -> None: self.amount = amount self.currency = currency
which we desire to translate to JSON as,
{ "amount": "10.00", "currency": "GBP" }
using encoders and decoders as so,
class MoneyJSONEncoder(json.JSONEncoder): def default(self, object_): if isinstance(object_, Money): return {'amount': object_.amount, 'currency': object_.currency} else: return super().default(object_) class MoneyJSONDecoder(json.JSONDecoder): def __init__(self, *args, **kwargs): super().__init__(object_hook=self.dict_to_object, *args, **kwargs) def dict_to_object(self, dict_): if 'amount' in dict_ and 'currency' in dict_: return Money(Decimal(dict_['amount']), dict_['currency']) else: return dict_ app.json_decoder = MoneyJSONDecoder app.json_encoder = MoneyJSONEncoder