We use Flask as our Python web server framework. Recently, our CI tests started failing with a JSON encoding error. Turns out, one of Flask’s dependencies, the
itsdangerous package got recently updated to version 2.0. In the new version, the package drops support for Python 2. For compatibility reasons,
itsdangerous was using the
simplejson package for serializing/deserializing JSON data.
After dropping Python 2 support, the new version uses the built-in Python
json package instead. Importantly, Flask uses
simplejson as well if it’s installed, and falls back to
json if not. With the new version of
itsdangerous doing without
simplejson, Flask will just use the built-in package.
json have an important difference -
json doesn’t support encoding the
Decimal type by default (nor
bytes for example). This is what caused our builds to fail and the rather trivial solution is to add these encoders manually. The confusing part is Flask using
simplejson simply if it’s installed, and
json otherwise as you can see here.