Python Bottle json_dumps - 将参数传递给默认处理函数
Python Bottle json_dumps - pass parameter to default handler function
如何在使用 Bottle 的 json_dumps 将数据转换为 JSON 时将参数传递给默认处理函数?
EDIT: I missed a point where I convert the data from json_dumps
, back to the previous format using json_loads
. The reason I use
json_dumps
is because i need to convert the datetime
format to
string
我有一个 MySQL 查询的结果作为元组列表:
data = [(u'user1', u'Topic1', datetime.datetime(2015, 8, 3, 23, 55), 2.0, 5), (u'user2', u'Topic2', datetime.datetime(2015, 8, 4, 23, 55), 3.0, 5)]
它包含一些 datetime
格式的数据。我将此数据作为对 AJAX 调用的响应以 JSON 格式发送,因此我对其执行 json_dumps
。
现在,我不能简单地执行 json_dumps(data)
,因为它给出了这个错误:
TypeError: datetime.datetime(2015, 8, 3, 23, 55) is not JSON serializable
所以,我定义了这个处理函数并按如下方式使用它:
def dataHandler(obj):
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M')
json_dumps(data, default=dataHandler)
这工作正常,输出是:
'[["user1", "Topic1", "2015-08-03 23:55", 2.0, 5], ["user2", "Topic2", "2015-08-04 23:55", 3.0, 5]
现在在我的代码的不同点,对于不同的数据,我需要不同格式的 datetime
。所以,我重新定义了这个函数:
def dataHandler(obj, showTime='no'):
if isinstance(obj, datetime):
if str(showTime).lower() == 'no':
return obj.strftime('%Y-%m-%d')
elif str(showTime).lower() == 'yes':
return obj.strftime('%Y-%m-%d %H:%M')
现在,如果我执行 json_dumps(data, default=dataHandler)
,它会正常工作,将 showTime
视为 no
,并给出与上面相同的输出。
当我试图给它传递一个参数时,问题就来了:
json_dumps(data, default=dataHandler('Yes'))
它给出了这个错误:
TypeError: datetime.datetime(2015, 8, 10, 23, 55) is not JSON serializable
如何在同一函数中定义不同的此类情况?
谢谢。
你可以使用 @decorator
(PEP-318).
示例:
def json_handler(show_time=True):
def decorated(obj):
if isinstance(obj, datetime.datetime):
return obj.strftime('%FT%T' if show_time else '%F')
if isinstance(obj, datetime.date):
return obj.strftime('%F')
return repr(obj) # catch-all
return decorated
然后:
>>> json.dumps(data, default=json_handler())
'[["user1", "Topic1", "2015-08-03T23:55:00", 2.0, 5], ["user2", "Topic2", "2015-08-04T23:55:00", 3.0, 5]]'
>>> json.dumps(data, default=json_handler(False))
'[["user1", "Topic1", "2015-08-03", 2.0, 5], ["user2", "Topic2", "2015-08-04", 3.0, 5]]'
编辑
行return repr(obj) # catch-all
将使用对象的表示而不是拒绝转储它(即:"<object object at 0x7f934f6ef0c0>"
而不是TypeError: <object object at 0x7f934f6ef0e0> is not JSON serializable
);这可能需要也可能不需要。
不要不要忘记调用装饰器!
如果不这样做(即:json.dumps(data, default=json_handler)
而不是 json.dumps(data, default=json_handler())
)将导致 RuntimeError: maximum recursion depth exceeded while calling a Python object
或 Segmentation Faults
.
如何在使用 Bottle 的 json_dumps 将数据转换为 JSON 时将参数传递给默认处理函数?
EDIT: I missed a point where I convert the data from
json_dumps
, back to the previous format usingjson_loads
. The reason I usejson_dumps
is because i need to convert thedatetime
format tostring
我有一个 MySQL 查询的结果作为元组列表:
data = [(u'user1', u'Topic1', datetime.datetime(2015, 8, 3, 23, 55), 2.0, 5), (u'user2', u'Topic2', datetime.datetime(2015, 8, 4, 23, 55), 3.0, 5)]
它包含一些 datetime
格式的数据。我将此数据作为对 AJAX 调用的响应以 JSON 格式发送,因此我对其执行 json_dumps
。
现在,我不能简单地执行 json_dumps(data)
,因为它给出了这个错误:
TypeError: datetime.datetime(2015, 8, 3, 23, 55) is not JSON serializable
所以,我定义了这个处理函数并按如下方式使用它:
def dataHandler(obj):
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M')
json_dumps(data, default=dataHandler)
这工作正常,输出是:
'[["user1", "Topic1", "2015-08-03 23:55", 2.0, 5], ["user2", "Topic2", "2015-08-04 23:55", 3.0, 5]
现在在我的代码的不同点,对于不同的数据,我需要不同格式的 datetime
。所以,我重新定义了这个函数:
def dataHandler(obj, showTime='no'):
if isinstance(obj, datetime):
if str(showTime).lower() == 'no':
return obj.strftime('%Y-%m-%d')
elif str(showTime).lower() == 'yes':
return obj.strftime('%Y-%m-%d %H:%M')
现在,如果我执行 json_dumps(data, default=dataHandler)
,它会正常工作,将 showTime
视为 no
,并给出与上面相同的输出。
当我试图给它传递一个参数时,问题就来了:
json_dumps(data, default=dataHandler('Yes'))
它给出了这个错误:
TypeError: datetime.datetime(2015, 8, 10, 23, 55) is not JSON serializable
如何在同一函数中定义不同的此类情况?
谢谢。
你可以使用 @decorator
(PEP-318).
示例:
def json_handler(show_time=True):
def decorated(obj):
if isinstance(obj, datetime.datetime):
return obj.strftime('%FT%T' if show_time else '%F')
if isinstance(obj, datetime.date):
return obj.strftime('%F')
return repr(obj) # catch-all
return decorated
然后:
>>> json.dumps(data, default=json_handler())
'[["user1", "Topic1", "2015-08-03T23:55:00", 2.0, 5], ["user2", "Topic2", "2015-08-04T23:55:00", 3.0, 5]]'
>>> json.dumps(data, default=json_handler(False))
'[["user1", "Topic1", "2015-08-03", 2.0, 5], ["user2", "Topic2", "2015-08-04", 3.0, 5]]'
编辑
行return repr(obj) # catch-all
将使用对象的表示而不是拒绝转储它(即:"<object object at 0x7f934f6ef0c0>"
而不是TypeError: <object object at 0x7f934f6ef0e0> is not JSON serializable
);这可能需要也可能不需要。
不要不要忘记调用装饰器!
如果不这样做(即:json.dumps(data, default=json_handler)
而不是 json.dumps(data, default=json_handler())
)将导致 RuntimeError: maximum recursion depth exceeded while calling a Python object
或 Segmentation Faults
.