JSON Encoding#
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
.
Money example#
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