docs: def _coerce_to_supported_type(cls, value):
          """
          Since we let users populate the context with whatever they want, this ensures the resolved value is something
          which the expression engine understands.
          :param value: the resolved value
          :return: the value converted to a supported data type
          """
          if value is None:
              return ""  # empty string rather than none
          elif isinstance(value, dict):
              if '*' in value:
                  return value['*']
              elif '__default__' in value:
                  return value['__default__']
              else:
                  return json.dumps(value, separators=(',', ':'))  # return serialized JSON if no default
          elif isinstance(value, bool):
              return value
          elif isinstance(value, float) or isinstance(value, int):
              return Decimal(value)
          else:
              return value