Когда я пытаюсь сделать jsonify(sample) я получаю:
Ошибка типа: datetime.datetime(2012, 8, 8, 21, 46, 24, 862000) не сериализуется в JSON
Что я могу сделать, чтобы мой образец словаря мог преодолеть приведенную выше ошибку?
Примечание: Хотя это может быть и не актуально, словари генерируются в результате извлечения записей из mongodb где при распечатке str(sample['somedate']) выводится 2012-08-08 21:46:24.862000.
Переведено автоматически
Ответ 1
Мой быстрый и грязный дамп JSON, который съедает даты и все остальное:
default это функция, применяемая к объектам, которые не сериализуемы.
В данном случае это str, поэтому он просто преобразует все, чего он не знает, в строки. Который отлично подходит для сериализации, но не так хорош при десериализации (отсюда "быстрый и грязный"), поскольку что угодно могло быть преобразовано в строку без предупреждения, например функция или массив numpy.
Ответ 2
Основываясь на других ответах, простое решение, основанное на конкретном сериализаторе, который просто преобразует datetime.datetime и datetime.date объекты в строки.
from datetime import date, datetime
defjson_serial(obj): """JSON serializer for objects not serializable by default json code"""
Как видно, код просто проверяет, относится ли объект к классу datetime.datetime или datetime.date, а затем использует .isoformat() для создания его сериализованной версии в соответствии с форматом ISO 8601, ГГГГ-ММ-DDTHH: MM: SS (который легко декодируется JavaScript). Если требуются более сложные сериализованные представления, вместо str () можно использовать другой код (примеры смотрите в других ответах на этот вопрос). Код заканчивается созданием исключения, чтобы разобраться со случаем, когда оно вызывается с несериализуемым типом.
Эту функцию json_serial можно использовать следующим образом:
from datetime import datetime from json import dumps
Первоначальный ответ соответствовал способу представления полей "даты" в MongoDB в виде:
{"$date": 1506816000000}
Если вам нужно универсальное решение на Python для сериализации datetime в json, ознакомьтесь с ответом @jjmontes для быстрого решения, не требующего зависимостей.
Поскольку вы используете mongoengine (согласно комментариям), а pymongo является зависимостью, в pymongo есть встроенные утилиты, помогающие с сериализацией в json: