我有一个基本的字典如下:
sample = {}
sample['title'] = "String"
sample['somedate'] = somedatetimehere
当我尝试做jsonify(sample)时,我得到:
TypeError: datetime.datetime(2012, 8, 8, 21, 46, 24, 862000) is not JSON serializable
我该怎么做才能使我的字典样本克服上面的错误呢?
注意:虽然它可能不相关,字典是从mongodb的记录检索中生成的,当我打印出str(sample['somedate'])时,输出是2012-08-08 21:46:24.862000。
在使用sqlalchemy在类中编写序列化装饰器时,我得到了相同的错误消息。所以不要:
Class Puppy(Base):
...
@property
def serialize(self):
return { 'id':self.id,
'date_birth':self.date_birth,
...
}
我只是借用了jgbarah使用isoformat()的想法,并将原始值附加到isoformat(),这样它现在看起来就像:
...
'date_birth':self.date_birth.isoformat(),
...
您应该在.datetime.now()方法上应用.strftime()方法,使其成为一个可序列化的方法。
这里有一个例子:
from datetime import datetime
time_dict = {'time': datetime.now().strftime('%Y-%m-%dT%H:%M:%S')}
sample_dict = {'a': 1, 'b': 2}
sample_dict.update(time_dict)
sample_dict
输出:
Out[0]: {'a': 1, 'b': 2, 'time': '2017-10-31T15:16:30'}
(更新):
在Python3.7及以后版本中,你可以简单地使用.isoformat()方法:
from datetime import datetime
datetime.now().isoformat()
通常有几种方法来序列化日期时间,比如:
ISO字符串,短,可以包含时区信息,例如@jgbarah的答案
时间戳(时区数据丢失),例如@JayTaylor的答案
属性字典(包括时区)。
如果您同意最后一种方法,json_tricks包将处理日期、时间和日期时间(包括时区)。
from datetime import datetime
from json_tricks import dumps
foo = {'title': 'String', 'datetime': datetime(2012, 8, 8, 21, 46, 24, 862000)}
dumps(foo)
这使:
{"title": "String", "datetime": {"__datetime__": null, "year": 2012, "month": 8, "day": 8, "hour": 21, "minute": 46, "second": 24, "microsecond": 862000}}
所以你要做的就是
`pip install json_tricks`
然后导入从json_tricks而不是json。
不将其存储为单个字符串、int型或float型的优势体现在解码时:如果你遇到的只是字符串,特别是int型或float型,你需要了解一些关于数据的信息,以知道它是否是一个datetime。作为dict,您可以存储元数据,以便自动解码,这就是json_tricks为您做的。它也很容易为人类编辑。
免责声明:这是我做的。因为我也有同样的问题。
这里有一个简单的解决方案来克服“datetime不可JSON序列化”
问题。
enco = lambda obj: (
obj.isoformat()
if isinstance(obj, datetime.datetime)
or isinstance(obj, datetime.date)
else None
)
json.dumps({'date': datetime.datetime.now()}, default=enco)
输出:-> {"date": "2015-12-16T04:48:20.024609"}