Python Bottle json_dumps - 将参数传递给默认处理函数

时间:2015-08-17 13:49:22

标签: python mysql json datetime bottle

如何使用Bottle的json_dumps将数据转换为JSON时,将参数传递给默认处理函数?

  

编辑:我错过了使用json_dumps将数据从json_loads转换回以前格式的点。我使用的原因   json_dumps是因为我需要将datetime格式转换为   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格式的一些数据。我发送这些数据作为对JSON格式的AJAX调用的响应,因为我在其上执行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

如何在同一个函数中定义不同的此类情况?

感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用@decoratorPEP-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 objectSegmentation Faults