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.

simplejson and 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.