Skip to content

Instantly share code, notes, and snippets.

@jcarley
Forked from ergoithz/json.py
Created September 16, 2022 18:10
Show Gist options
  • Select an option

  • Save jcarley/036ae89484bd40d046c8e51a8a8b3c1b to your computer and use it in GitHub Desktop.

Select an option

Save jcarley/036ae89484bd40d046c8e51a8a8b3c1b to your computer and use it in GitHub Desktop.

Revisions

  1. @ergoithz ergoithz revised this gist May 21, 2015. 1 changed file with 19 additions and 17 deletions.
    36 changes: 19 additions & 17 deletions json.py
    Original file line number Diff line number Diff line change
    @@ -1,40 +1,43 @@
    import json
    import time
    import datetime
    import dateutil.tz
    import dateutil.parser

    class JSONEncoder(json.JSONEncoder):
    def default(self, obj):
    if isinstance(obj, datetime.datetime):
    offset = obj.utcoffset()
    return {
    'type': 'datetime',
    'data': [time.mktime(obj.utctimetuple()), (-time.timezone) if offset is None else offset.seconds]
    'data': obj.isoformat()
    }
    if isinstance(obj, datetime.date):
    return {
    'type': 'date',
    'data': time.mktime(obj.utctimetuple())
    'data': obj.isoformat()
    }
    return super(JSONEncoder, self).default(obj)


    def default_object_hook(obj):
    if 'type' in obj and 'data' in obj:
    if obj['type'] == 'datetime':
    ts, offset = obj['data']
    return datetime.datetime.fromtimestamp(ts, dateutil.tz.tzoffset(None, offset))
    if obj['type'] == 'datetime':
    return datetime.date.fromtimestamp(obj['data'])
    return obj
    class JSONDecoder(json.JSONDecoder):
    def __init__(self, *args, **kwargs):
    kwargs.setdefault('object_hook', self.default_object_hook)
    super(JSONDecoder, self).__init__(*args, **kwargs)

    def default_object_hook(self, obj):
    if 'type' in obj and 'data' in obj:
    if obj['type'] == 'datetime':
    return dateutil.parser.parse(obj['data'])
    if obj['type'] == 'date':
    return datetime.parser.parse(obj['data']).date()
    return obj


    def dumps(*args, **kwargs):
    kwargs.setdefault('cls', JSONEncoder)
    return json.dumps(*args, **kwargs)


    def loads(*args, **kwargs):
    kwargs.setdefault('object_hook', default_object_hook)
    kwargs.setdefault('cls', JSONDecoder)
    return json.loads(*args, **kwargs)


    @@ -45,9 +48,8 @@ def loads(*args, **kwargs):
    print(loads(b))

    import pytz
    a = datetime.datetime.now()
    a = pytz.timezone('Europe/Berlin').localize(a)
    a = pytz.timezone('Europe/Madrid').localize(a)
    b = dumps(a)
    print(a)
    print(b)
    print(loads(b))
    print(loads(b))
  2. @ergoithz ergoithz revised this gist May 21, 2015. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion json.py
    Original file line number Diff line number Diff line change
    @@ -46,7 +46,7 @@ def loads(*args, **kwargs):

    import pytz
    a = datetime.datetime.now()
    a.replace(tzinfo=pytz.timezone('Europe/Berlin'))
    a = pytz.timezone('Europe/Berlin').localize(a)
    b = dumps(a)
    print(a)
    print(b)
  3. @ergoithz ergoithz created this gist May 21, 2015.
    53 changes: 53 additions & 0 deletions json.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,53 @@
    import json
    import time
    import datetime
    import dateutil.tz

    class JSONEncoder(json.JSONEncoder):
    def default(self, obj):
    if isinstance(obj, datetime.datetime):
    offset = obj.utcoffset()
    return {
    'type': 'datetime',
    'data': [time.mktime(obj.utctimetuple()), (-time.timezone) if offset is None else offset.seconds]
    }
    if isinstance(obj, datetime.date):
    return {
    'type': 'date',
    'data': time.mktime(obj.utctimetuple())
    }
    return super(JSONEncoder, self).default(obj)


    def default_object_hook(obj):
    if 'type' in obj and 'data' in obj:
    if obj['type'] == 'datetime':
    ts, offset = obj['data']
    return datetime.datetime.fromtimestamp(ts, dateutil.tz.tzoffset(None, offset))
    if obj['type'] == 'datetime':
    return datetime.date.fromtimestamp(obj['data'])
    return obj


    def dumps(*args, **kwargs):
    kwargs.setdefault('cls', JSONEncoder)
    return json.dumps(*args, **kwargs)

    def loads(*args, **kwargs):
    kwargs.setdefault('object_hook', default_object_hook)
    return json.loads(*args, **kwargs)


    a = datetime.datetime.now()
    b = dumps(a)
    print(a)
    print(b)
    print(loads(b))

    import pytz
    a = datetime.datetime.now()
    a.replace(tzinfo=pytz.timezone('Europe/Berlin'))
    b = dumps(a)
    print(a)
    print(b)
    print(loads(b))