def default(self, obj): serializable = None if isinstance(obj, bytearray) or isinstance(obj, bytes): serializable = {"__bytes__": base64.b64encode(obj).decode()} elif isinstance(obj, datetime.datetime): pack = struct.pack("d", ntp.datetime2ntp(obj)) serializable = {"__ntp__": base64.b64encode(pack).decode()} else: try: serializable = _json.JSONEncoder.default(self, obj) except TypeError as e: logger = logging.getLogger("boing.net.json._ProductEncoder") logger.warning(str(e)) return serializable
def _arg_encode(arg, typetag): if typetag == "i": return struct.pack("!i", int(arg)) elif typetag == "f": return struct.pack("!f", float(arg)) elif typetag == "s": if not isinstance(arg, bytes): arg = str(arg).encode() size = _pad(len(arg) + 1) return struct.pack("!%ds" % size, arg) elif typetag == "b": if not isinstance(arg, bytes): arg = str(arg).encode() realsize = len(arg) size = _pad(realsize) return struct.pack("!i%ds" % size, realsize, arg) elif typetag == "t": if arg is None: return struct.pack("!q", IMMEDIATELY) if type(arg) is datetime.datetime: return ntp.ntpEncode(ntp.datetime2ntp(arg)) raise ValueError("Time tag should be a datetime.datetime object or None for IMMEDIATELY") else: raise TypeError("Unsupported type tag (%s)" % typetag)