将用户构建的json编码器传递给Flask的jsonify

Ale*_*lex 8 python json numpy flask

我想传递一个我写入Flask jsonify函数的numpy JSON序列化器,但我找不到办法做到这一点.我无法使用json.dumps,因为我必须在处理错误消息时设置Flask响应的status_code.有没有办法将JSON序列化程序作为参数传递,类似于使用如下所示的cls参数json.dumps:将numpy类型转换为python?我的代码如下; 谢谢.

import json
import numpy as np
from flask import Flask, jsonify

class JSON_Improved(json.JSONEncoder):
    '''
    Used to help jsonify numpy arrays or lists that contain numpy data types.
    '''
    def default(self, obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        else:
            return super(MyEncoder, self).default(obj)

app = Flask(__name__)
@app.errorhandler(ErrorMessage)
def handle_invalid_usage(error):
    response = jsonify(error.to_dict())
    response.status_code = error.status_code
    return response
Run Code Online (Sandbox Code Playgroud)

Dmi*_*try 16

由于json_encoder在 Flask 2.2 中已弃用,并将在 Flask 2.3 中删除,因此以下更新可能有用。

文档指出:

要使用不同的提供程序,可以子类化Flask并设置 json_provider_class为提供程序类,或者设置app.json为该类的实例。

因此,对于派生类,解决方案是:

class MyFlask(Flask):
    json_provider_class = CustomJSONProvider

app = MyFlask(__name__)
Run Code Online (Sandbox Code Playgroud)

或者,在直接实例化类的情况下Flask,只需:

app = Flask(__name__)
app.json = CustomJSONProvider(app)
Run Code Online (Sandbox Code Playgroud)

给定已经定义的JSON_Improved编码器,样本类CustomJSONProvider将是:

from flask.json.provider import JSONProvider
    
    
class CustomJSONProvider(JSONProvider):
    
    def dumps(self, obj, **kwargs):
        return json.dumps(obj, **kwargs, cls=JSON_Improved)
    
    def loads(self, s: str | bytes, **kwargs):
        return json.loads(s, **kwargs)
Run Code Online (Sandbox Code Playgroud)


sta*_*mer 11

您可以使用自定义Flask应用程序的json编码器app.json_encoder = JSON_Improved.JSON_Improved继承自flask.json.JSONEncoder

class JSON_Improved(JSONEncoder):

    pass
Run Code Online (Sandbox Code Playgroud)

http://flask.pocoo.org/snippets/119/上有一个关于它的Flask Snippets

  • 该片段的链接已失效,因为所有片段均已从 Flask 网站中删除。请参阅其网站存储库上的[此问题](https://github.com/pallets/website/issues/41)。您可以在 https://web.archive.org/web/20190128005233/http://flask.pocoo.org/snippets/119 获取此片段 (4认同)