Вы можете расширить json.JSONEncoder, чтобы создать свой собственный кодировщик, который сможет работать с объектами datetime.datetime (или объектами любого типа по вашему желанию) таким образом, что создается строка, которая может быть воспроизведена как новая экземпляр datetime.datetime. Я считаю, что это должно быть так просто, как если бы json.JSONEncoder вызывал repr () для ваших экземпляров datetime.datetime.
Процедура того, как это сделать, описана в документах json module .
Модуль json проверяет тип каждого значения, которое необходимо кодировать, и по умолчанию он знает только, как обрабатывать объекты dicts, списки, кортежи, strs, Unicode, int, long, float, boolean и none: -)
Для вас также может быть важен аргумент skipkeys для JSONEncoder.
После прочтения ваших комментариев я пришел к выводу, что не существует простого решения, позволяющего JSONEncoder кодировать ключи словарей с помощью специальной функции. Если вам интересно, вы можете посмотреть на источник и методы iterencode (), которые вызывают _iterencode (), который вызывает _iterencode_dict (), где и возникает ошибка типа.
Проще всего было бы создать новый dict с изоформатированными ключами, подобным этому:
import datetime, json
D = {datetime.datetime.now(): 'foo',
datetime.datetime.now(): 'bar'}
new_D = {}
for k,v in D.iteritems():
new_D[k.isoformat()] = v
json.dumps(new_D)
Что возвращает '{"2010-09-15T23: 24: 36.169710": "foo", "2010-09-15T23: 24: 36.169723": "bar"}'. Для тонкости, оберните его в функцию: -)