python - 类型错误 : Object of type 'datetime' is not JSON serializable (with serialize function)

标签 python json flask serialization sqlalchemy

我得到这个 TypeError: Object of type 'datetime' is not JSON serializable错误,即使我的模型中描述了特定的序列化函数。

这是我的代码:

Flask 路线(由 React 渲染):

menus.py

@menus_bp.route('/menus', methods=['GET', 'POST'])
def menus():

    response_object = {
        'status': 'fail',
        'message': 'Invalid payload.'
        }
    try:
        user = User.query.filter_by(id=1).first()
        if user.menu == []:
            return edit_menu()
        else:
            template = render_template('menus.html')
            response_object = {
                'status': 'success',
                'message': 'success',
                'data': [{"restaurant": user.restaurant,
                          "menu": menu,
                          "content": template}] # template passed to React
                }

            # db method
            Create_Menu(user=user)

        return jsonify(response_object), 200
    except (exc.IntegrityError, ValueError):
        db.session.rollback()
        return jsonify(response_object), 400

方法.py
def Create_Menu(user):
    menu = Menu(user=user)
    db.session.add(menu)
    db.session.commit()

    return {"status": True,
            "menu": menu}

最后是 Menu 模型,它有一个 serialize()功能:
class Menu(db.Model):
    __tablename__='menu'
    """
    Model for storing menus. 
    """   
    id = db.Column(db.Integer, primary_key=True)
    created = db.Column(db.DateTime, default=func.now(), nullable=False)       
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

    def __init__(self, user):
        self.user = user

    def serialize(self):
       return { 'id' : self.id,
                'created': self.created,
                'coffees' : [ item.serialize() for item in self.coffees]}

但我得到以下回溯:
TypeError: Object of type 'datetime' is not JSON serializable

File "/usr/lib/python3.6/site-packages/flask/app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/lib/python3.6/site-packages/flask/app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "/usr/lib/python3.6/site-packages/flask_restful/__init__.py", line 269, in error_router
return original_handler(e)
File "/usr/lib/python3.6/site-packages/flask_cors/extension.py", line 161, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/usr/lib/python3.6/site-packages/flask/app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/lib/python3.6/site-packages/flask/_compat.py", line 34, in reraise
raise value.with_traceback(tb)
File "/usr/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/usr/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/lib/python3.6/site-packages/flask_restful/__init__.py", line 269, in error_router
return original_handler(e)
File "/usr/lib/python3.6/site-packages/flask_cors/extension.py", line 161, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/usr/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/lib/python3.6/site-packages/flask/_compat.py", line 34, in reraise
raise value.with_traceback(tb)
File "/usr/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/lib/python3.6/site-packages/flask_debugtoolbar/__init__.py", line 125, in dispatch_request
return view_func(**req.view_args)
File "/usr/lib/python3.6/site-packages/flask_restful/__init__.py", line 462, in wrapper
return self.make_response(data, code, headers=headers)
File "/usr/lib/python3.6/site-packages/flask_restful/__init__.py", line 491, in make_response
resp = self.representations[mediatype](data, *args, **kwargs)
File "/usr/lib/python3.6/site-packages/flask_restful/representations/json.py", line 21, in output_json
dumped = dumps(data, **settings) + "\n"
File "/usr/lib/python3.6/json/__init__.py", line 238, in dumps
**kw).encode(obj)
File "/usr/lib/python3.6/json/encoder.py", line 201, in encode
chunks = list(chunks)
File "/usr/lib/python3.6/json/encoder.py", line 430, in _iterencode
yield from _iterencode_dict(o, _current_indent_level)
File "/usr/lib/python3.6/json/encoder.py", line 404, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.6/json/encoder.py", line 404, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.6/json/encoder.py", line 325, in _iterencode_list
yield from chunks
File "/usr/lib/python3.6/json/encoder.py", line 404, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.6/json/encoder.py", line 325, in _iterencode_list
yield from chunks
File "/usr/lib/python3.6/json/encoder.py", line 404, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.6/json/encoder.py", line 437, in _iterencode
o = _default(o)
File "/usr/lib/python3.6/json/encoder.py", line 180, in default
o.__class__.__name__)
TypeError: Object of type 'datetime' is not JSON serializable

当我在后端使用 Flask 重新创建模板时,它曾经可以工作,但现在使用前端请求时,它会因上述错误而中断。

现在怎么了?为什么我的序列化功能不再起作用?

最佳答案

见下文(使用自定义 JSON 编码器)

http://flask.pocoo.org/snippets/119/还有

import datetime
import json


class DateTimeEncoder(json.JSONEncoder):
    def default(self, z):
        if isinstance(z, datetime.datetime):
            return (str(z))
        else:
            return super().default(z)


my_dict = {'date': datetime.datetime.now()}

print(json.dumps(my_dict,cls=DateTimeEncoder))

输出
{"date": "2019-06-12 15:44:14.978766"}

关于python - 类型错误 : Object of type 'datetime' is not JSON serializable (with serialize function),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56554159/

相关文章:

python - 使用 python flask 从数据库中删除行?

javascript - 文本文件如何逐行发送到浏览器

python - 如何在不使用scipy的情况下计算python中的累积分布函数

python - 如何循环遍历整个 JSON 文件并将数据提取到变量中

php - 强制 PHP json_encode() 将索引编码为字符串

java - 在不使用 POJO 的情况下使用 GSON 修改 json

python - 无需请求即可获取 Flask App 的 url

Python izip 和重复内存行为

python - Python 中的 Protovis 风格色标?

c++ - 在 Qt5 中发送 JSON 文件的 POST 请求