【问题标题】:Python Bottle json_dumps - pass parameter to default handler functionPython Bottle json_dumps - 将参数传递给默认处理函数
【发布时间】:2015-11-10 04:39:38
【问题描述】:

如何在使用 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 格式的数据。我将此数据作为对 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

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

谢谢。

【问题讨论】:

    标签: python mysql json datetime bottle


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多