很多人会遇到 flask jsonify
在序列化 numpy
数据时遇到的 typeError(float32, float64...)
这是我们可以覆写flask的默认序列化方法,来兼容numpy
的数据类型
在 flask 2.2之前, 可以通过以下方法: flask < 2.2
import datatime
from flask import Flask as _Flask
from flask.json import JSONEncoder as _JSONEncoder
class FlaskJSONEncoder(_JSONEncoder):
"""重载flask的json encoder, 确保jsonfy()能解析numpy的json"""
def default(self, obj):
if isinstance(obj, (np.integer, np.floating, np.bool_)):
return obj.item()
elif isinstance(obj, np.ndarray):
return obj.tolist()
elif isinstance(obj, (datetime.datetime, datetime.timedelta)):
return obj.__str__()
else:
return super(FlaskJSONEncoder, self).default(obj)
class Flask(_Flask):
"""重载flask的jsonencoder, 确保能解析numpy的json"""
json_encoder = FlaskJSONEncoder
app = Flask(__name__)
在flask2.2中引入了flask.json.provider.DefaultJSONProvider
, 并在2.3版本后删除了 flask.json.JSONEncoder
当 flask版本大于等于2.2 时, 可以使用以下方法: flask >= 2.2
import datatime
from flask import Flask as _Flask
from flask.json.provider import DefaultJSONProvider, _default as FlaskDefault
class FlaskJSONProvider(DefaultJSONProvider):
"""重载flask的json encoder, 确保jsonfy()能解析numpy的json"""
@staticmethod
def _default(obj):
if isinstance(obj, (np.integer, np.floating, np.bool_)):
return obj.item()
elif isinstance(obj, np.ndarray):
return obj.tolist()
elif isinstance(obj, (datetime.datetime, datetime.timedelta)):
return obj.__str__()
else:
return FlaskDefault(obj)
default = _default
class Flask(_Flask):
"""重载flask的json_provider_class, 确保能解析numpy的json"""
json_provider_class = FlaskJSONProvider
app = Flask(__name__)