How to overcome “datetime.datetime not JSON serializable”?

后端 未结 30 2712
梦谈多话
梦谈多话 2020-11-22 03:31

I have a basic dict as follows:

sample = {}
sample[\'title\'] = \"String\"
sample[\'somedate\'] = somedatetimehere
         


        
30条回答
  •  [愿得一人]
    2020-11-22 04:05

    if you are using python3.7, then the best solution is using datetime.isoformat() and datetime.fromisoformat(); they work with both naive and aware datetime objects:

    #!/usr/bin/env python3.7
    
    from datetime import datetime
    from datetime import timezone
    from datetime import timedelta
    import json
    
    def default(obj):
        if isinstance(obj, datetime):
            return { '_isoformat': obj.isoformat() }
        return super().default(obj)
    
    def object_hook(obj):
        _isoformat = obj.get('_isoformat')
        if _isoformat is not None:
            return datetime.fromisoformat(_isoformat)
        return obj
    
    if __name__ == '__main__':
        #d = { 'now': datetime(2000, 1, 1) }
        d = { 'now': datetime(2000, 1, 1, tzinfo=timezone(timedelta(hours=-8))) }
        s = json.dumps(d, default=default)
        print(s)
        print(d == json.loads(s, object_hook=object_hook))
    

    output:

    {"now": {"_isoformat": "2000-01-01T00:00:00-08:00"}}
    True
    

    if you are using python3.6 or below, and you only care about the time value (not the timezone), then you can use datetime.timestamp() and datetime.fromtimestamp() instead;

    if you are using python3.6 or below, and you do care about the timezone, then you can get it via datetime.tzinfo, but you have to serialize this field by yourself; the easiest way to do this is to add another field _tzinfo in the serialized object;

    finally, beware of precisions in all these examples;

提交回复
热议问题