Skip to content

Instantly share code, notes, and snippets.

@dxlbnl
Last active April 8, 2017 15:11
Show Gist options
  • Save dxlbnl/920fbf8aceefa2e4d3a17e103deaf44f to your computer and use it in GitHub Desktop.
Save dxlbnl/920fbf8aceefa2e4d3a17e103deaf44f to your computer and use it in GitHub Desktop.
#!/usr/bin/python3
import datetime
from dateutil.parser import parse as parsedate
import json
import re
# Als je dit onder python3 wil draaien, moet je even 'python-dateutil' installeren
isoformat_regex = re.compile(r'(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}).(\d{6})')
class DateJSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.isoformat()
else:
return super.default(obj)
class DateJSONDecoder(json.JSONDecoder):
def __init__(self, **kw):
json.JSONDecoder.__init__(self, object_hook=self.dict_to_object, **kw)
# def decode(self, s):
# print 'decode', s, isoformat_regex.match(s)
# return super(DateJSONDecoder, self).decode(s)
def transform_value(self, value):
if isinstance(value, list):
return list(map(self.transform_value, value))
if isinstance(value, str) and isoformat_regex.match(value):
return parsedate(value)
return value
def dict_to_object(self, d):
print('obj', d)
return {
key: self.transform_value(value)
for (key, value) in d.items()
}
if __name__ == '__main__':
raw = {
'a': 234,
'b': '234',
'obj': {
'datelist': [datetime.datetime.now(), datetime.datetime.now()],
'dateobjlist': [{
'date': datetime.datetime.now()
}, {
'date': datetime.datetime.now()
}],
'obj': {
'date': datetime.datetime.now()
}
},
'date': datetime.datetime.now()
}
print('raw', raw)
enc = json.dumps(raw, cls=DateJSONEncoder, indent=4)
print('enc', enc)
dec = json.loads(enc, cls=DateJSONDecoder)
print('dec', dec)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment