import base64 import json import logging import traceback import zlib from decimal import Decimal # DecimalEncoder is a helper class to convert a DynamoDB item to JSON. # Ref: https://stackoverflow.com/questions/40033189/using-boto3-in-python-to-acquire-results-from-dynamodb-and-parse-into-a-usable-v class DecimalEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, Decimal): # <---resolving decimals try: if o == o.to_integral_value(): # integers return int(o) else: # floats # d = float(o) # return string if precision lost # if 'e' in str(d): # return format(o, "f") # else: # return d return float(o) except Exception as e: logging.getLogger().warning( "Error encoding Decimal value to number.") # logging.getLogger().warning(json.dumps(traceback.format_exception( # type(e), e, e.__traceback__))) # return format(o, "f") raise e if isinstance(o, set): # <---resolving sets as lists return list(o) return super(DecimalEncoder, self).default(o) def encode_obj(input): if not input: return None return base64.b64encode( zlib.compress( json.dumps(input, cls=DecimalEncoder).encode('utf8') ) ).decode('utf8') def decode_obj(input): if not input: return None return json.loads( zlib.decompress( base64.b64decode(input) ).decode('utf8') )