encoders.py
60 lines
| 1.9 KiB
| text/x-python
|
PythonLexer
r0 | # -*- coding: utf-8 -*- | |||
r112 | # Copyright 2010 - 2017 RhodeCode GmbH and the AppEnlight project authors | |||
r0 | # | |||
r112 | # Licensed under the Apache License, Version 2.0 (the "License"); | |||
# you may not use this file except in compliance with the License. | ||||
# You may obtain a copy of the License at | ||||
r0 | # | |||
r112 | # http://www.apache.org/licenses/LICENSE-2.0 | |||
r0 | # | |||
r112 | # Unless required by applicable law or agreed to in writing, software | |||
# distributed under the License is distributed on an "AS IS" BASIS, | ||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
# See the License for the specific language governing permissions and | ||||
# limitations under the License. | ||||
r0 | ||||
import json | ||||
from datetime import datetime, date, timedelta | ||||
DATE_FORMAT = '%Y-%m-%dT%H:%M:%S.%f' | ||||
class DateEncoder(json.JSONEncoder): | ||||
def default(self, obj): | ||||
if isinstance(obj, datetime): | ||||
return { | ||||
'__type__': '__datetime__', | ||||
'iso': obj.strftime(DATE_FORMAT) | ||||
} | ||||
elif isinstance(obj, date): | ||||
return { | ||||
'__type__': '__date__', | ||||
'iso': obj.strftime(DATE_FORMAT) | ||||
} | ||||
elif isinstance(obj, timedelta): | ||||
return { | ||||
'__type__': '__timedelta__', | ||||
'seconds': obj.total_seconds() | ||||
} | ||||
else: | ||||
return json.JSONEncoder.default(self, obj) | ||||
def date_decoder(dct): | ||||
if '__type__' in dct: | ||||
if dct['__type__'] == '__datetime__': | ||||
return datetime.strptime(dct['iso'], DATE_FORMAT) | ||||
elif dct['__type__'] == '__date__': | ||||
return datetime.strptime(dct['iso'], DATE_FORMAT).date() | ||||
elif dct['__type__'] == '__timedelta__': | ||||
return timedelta(seconds=dct['seconds']) | ||||
return dct | ||||
def json_dumps(obj): | ||||
return json.dumps(obj, cls=DateEncoder) | ||||
def json_loads(obj): | ||||
return json.loads(obj.decode('utf8'), object_hook=date_decoder) | ||||