Python 瓶子框架:如何在JSON响应中返回datetime
当我试图返回包含Python 瓶子框架:如何在JSON响应中返回datetime,python,json,datetime,bottle,bson,Python,Json,Datetime,Bottle,Bson,当我试图返回包含datetime值的JSON时,我得到 File "/usr/lib/python2.7/json/encoder.py", line 178, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: datetime.datetime(2014, 2, 1, 0, 0) is not JSON serializable 这是正常的。有没有一种简单的方法可以将对象挂钩添
datetime
值的JSON时,我得到
File "/usr/lib/python2.7/json/encoder.py", line 178, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: datetime.datetime(2014, 2, 1, 0, 0) is not JSON serializable
这是正常的。有没有一种简单的方法可以将对象挂钩添加到瓶子
中
from bson import json_util
import json
json.dumps(anObject, default=json_util.default)
要转换
datetime
值?有趣的问题!我可以看到两种方法。一种方法是编写一个定制插件来包装JSONPlugin
:
from bottle import route, run, install, JSONPlugin
from bson import json_util
class JSONDefaultPlugin(JSONPlugin):
def __init__(self):
super(JSONDefaultPlugin, self).__init__()
self.plain_dump = self.json_dumps
self.json_dumps = lambda body: self.plain_dump(body, default=json_util.default)
然后可以这样使用:
@route('/hello')
def index(name):
return {'test': datetime.datetime(2014, 2, 1, 0, 0)}
install(JSONDefaultPlugin())
run(host='localhost', port=8080)
{"test": {"$date": 1391212800000}}
并将给出如下输出:
@route('/hello')
def index(name):
return {'test': datetime.datetime(2014, 2, 1, 0, 0)}
install(JSONDefaultPlugin())
run(host='localhost', port=8080)
{"test": {"$date": 1391212800000}}
另一种较短的方法是,在实例化JSONPlugin类时,只需指定json\u loads
参数:
import json
from bson import json_util
install(JSONPlugin(json_dumps=lambda body: json.dumps(body, default=json_util.default)))
这会产生相同的结果
背景
当您查看(为了简洁起见,下面删除了一些部分)时,这一切就更有意义了:
我们需要做的就是确保对
的调用转储那里的接收到您希望提供的默认值
关键字参数。为什么不使用类似于datetime.strftime(o,,%Y-%m-%d%H:%m')
?此@arocks的可能重复项否,我问的是一个瓶子框架,它能在响应时自动将DICT转换成json数据。@fp我想用框架工具来实现。你能告诉我们你的返回方法吗?回答得很好!我懒得看一下源代码:-)或者这个缩写battle.install(battle.JSONPlugin(json\u dumps=json\u util.dumps))