bot-base/storage/jsonencoder.py

35 lines
1.2 KiB
Python
Raw Normal View History

import datetime
import json
2020-03-22 19:27:30 +01:00
data_type = "__data_type"
content = "__content"
class Encoder(json.JSONEncoder):
2020-03-22 19:27:30 +01:00
def __init__(self):
super().__init__()
self.custom = {}
def register(self, type_, encode, decode):
self.custom.update({type_: (encode, decode)})
def default(self, obj):
2020-03-22 19:32:51 +01:00
if isinstance(obj, tuple(self.custom.keys())):
return {data_type: f'{type(obj)}', content: self.custom[type(obj)][0](obj)}
if isinstance(obj, (datetime.datetime)):
2020-03-22 19:27:30 +01:00
return {data_type: 'datetime.datetime', 'iso': obj.isoformat()}
if isinstance(obj, (datetime.timedelta)):
2020-03-22 19:27:30 +01:00
return {data_type: 'datetime.timedelta', 'totalseconds': obj.total_seconds()}
return json.JSONEncoder.default(self, obj)
2020-03-22 19:27:30 +01:00
def hook(self, dct):
if data_type in dct:
for ty in self.custom.keys():
if str(ty) == dct[data_type]:
return self.custom[ty][1](dct[content])
if dct[data_type] == "datetime.datetime":
return datetime.datetime.fromisoformat(dct['iso'])
elif dct[data_type] == "datetime.timedelta":
return datetime.timedelta(seconds=dct['totalseconds'])
return dct