【问题标题】:Flask datetime.date is not JSON serializableFlask datetime.date 不是 JSON 可序列化的
【发布时间】:2021-05-02 05:04:35
【问题描述】:

我试图返回一个字典列表作为获取请求的一部分。我正在调用下面的函数。

def get_data(id):
  selected_data = Database.get_date(id)
  json.dumps(selected_data, default=str)
  return jsonify({'data': selected_data})

selected_data 就像

[{'date': datetime.date(2019, 1, 15), 'id': 1, 'name': 'John '}, {'date': datetime.date(2019, 1, 11), 'id': 2, 'name': 'Jane'}]

但是,我收到以下错误

TypeError(repr(o) + " 不是 JSON 可序列化的") TypeError: datetime.date(2019, 1, 15) is not JSON serializable

我尝试使用像this stack overflow 线程建议的 json.dumps,但仍然遇到相同的错误。

感谢任何帮助。

【问题讨论】:

  • jsonifty() 之前,将datetime.date 转换为字符串或timestamp
  • 嘿,最终做到了。感谢您的回复。

标签: python flask


【解决方案1】:

你应该实现一个客户 JSONEncoder

import json
from datetime import date
from datetime import datetime
class JsonExtendEncoder(json.JSONEncoder):
    """
        This class provide an extension to json serialization for datetime/date.
    """
    def default(self, o):
        """
            provide a interface for datetime/date
        """
        if isinstance(o, datetime):
            return o.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(o, date):
            return o.strftime('%Y-%m-%d')
        else:
            return json.JSONEncoder.default(self, o)
if __name__ == '__main__':
    d = {'now': datetime.now(), 'today': date.today(), 'i': 100}
    ds = json.dumps(d, cls=JsonExtendEncoder)
    print "ds type:", type(ds), "ds:", ds
    l = json.loads(ds)

【讨论】:

  • 使用isoformat 代替strftime 是个好主意,因为它是许多JavaScript 库都喜欢的网络标准。
【解决方案2】:

尝试以下方法之一

selected_data["date"] = selected_data["date"].isoformat()
selected_data["date"] = selected_data["date"].strftime("%Y-%m-%d %H:%M:%S:%f")
selected_data["date"] = str(selected_data["date"])

【讨论】:

  • 这行得通,selected_data["date"] = selected_data["date"].isoformat()。采纳答案,谢谢
【解决方案3】:

这是我的处理方法。对于烧瓶和烧瓶休息的用户

import json # import json at the top

# inside your def use this code
jsonObj = json.dumps(my_dictionary, indent=1, sort_keys=True, default=str)
return json.loads(jsonObj), 200

【讨论】:

    猜你喜欢
    • 2014-06-10
    • 1970-01-01
    • 2018-02-10
    • 2022-01-26
    • 2021-09-24
    • 2020-09-05
    • 2019-06-01
    • 2019-03-05
    • 2019-07-12
    相关资源
    最近更新 更多