Регистрация словарей с объектами datetime без ошибки сериализации - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь зарегистрировать python словарь как JSON, например, logging.info(dict(msg="foo", data=obj)). Однако в некоторых случаях obj может содержать объекты datetime, и в этих случаях я получаю ошибку сериализации JSON.

Существует ли простой способ регистрации словарей, в которых объекты (например, объекты datetime) сериализуются автоматически Например, вызвать функцию «str» для этих объектов?

1 Ответ

1 голос
/ 11 января 2020

Вы можете определить свой собственный сериализатор для datetime объекта:

def to_json(python_object):
    if isinstance(python_object, datetime.datetime):
        return {'__class__': 'datetime.datetime',
                '__value__': time.asctime(python_object.timetuple())}
    if isinstance(python_object, time.struct_time):
        return {'__class__': 'time.asctime',
                '__value__': time.asctime(python_object)}
    if isinstance(python_object, bytes):
        return {'__class__': 'bytes',
                '__value__': list(python_object)}
    raise TypeError(repr(python_object) + ' is not JSON serializable')

def from_json(json_object):
    if '__class__' in json_object:
        if json_object['__class__'] == 'datetime.datetime':
            return datetime.datetime.fromtimestamp(time.mktime(time.strptime(json_object['__value__'])))
        if json_object['__class__'] == 'time.asctime':
            return time.strptime(json_object['__value__'])
        if json_object['__class__'] == 'bytes':
            return bytes(json_object['__value__'])
    return json_object

и затем назвать его так:

json.dump(entry, f, default=to_json)

или для чтения обратно

entry = json.load(f, object_hook=from_json)
...