【问题标题】:Python Flask : How to convert a dictionary object to json? [duplicate]Python Flask:如何将字典对象转换为 json? [复制]
【发布时间】:2019-02-01 16:04:13
【问题描述】:

我对 Python 还很陌生。所以我有一个基于 Flask 的 REST API。所以我有一个字典如下:

dict = {'left': 0.17037454, 'right': 0.82339555, '_unknown_': 0.0059609693}

我需要将它添加到我的 json 响应对象中,如下所示:

message = {
                            'status': 200,
                            'message': 'OK',
                            'scores': dict 
                        }
                resp = jsonify(message)
                resp.status_code = 200
                print(resp)
                return resp

我收到以下错误:

....\x.py", line 179, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: 0.027647732 is not JSON serializable

有人可以帮我解决这个问题吗? 谢谢。

【问题讨论】:

    标签: python json flask


    【解决方案1】:

    代码对我来说运行良好。看下面的示例服务器代码:

    from flask import Flask
    from flask import jsonify
    
    app = Flask(__name__)
    
    
    @app.route('/')
    def hello():
        d = {'left': 0.17037454, 'right': 0.82339555, '_unknown_': 0.0059609693}
        message = {
            'status': 200,
            'message': 'OK',
            'scores': d
        }
        resp = jsonify(message)
        resp.status_code = 200
        print(resp)
        return resp
    
    if __name__ == '__main__':
        app.run()
    

    以下 curl 返回正常:

    $ curl http://localhost:5000/
    {
      "message": "OK", 
      "scores": {
        "_unknown_": 0.0059609693, 
        "left": 0.17037454, 
        "right": 0.82339555
      }, 
      "status": 200
    }
    

    【讨论】:

    • dict 上执行json.dumps 然后jsonify(message)jsonifydict 两次,你确定这是正确的做事方式吗?
    • @ThatBird 更新
    【解决方案2】:

    当您尝试 jsonify 不是纯 Python 字典的内容时会出现此错误。所以只需使用纯 python 对象,它们很容易转换为 JSON。

    from flask import Flask, jsonify
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        dict_obj = {
            'left': 0.17037454, 
            'right': 0.82339555, 
            '_unknown_': 0.0059609693
        }
        message = {
            'status': 200,
            'message': 'OK',
            'scores': dict_obj
        }
        resp = jsonify(message)
        resp.status_code = 200
        print(resp)
        return resp
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    这是一个非常简单的代码。

    运行此代码后,当您在浏览器中点击localhost:5000 时,您会看到此输出

    {
      "message": "OK", 
      "scores": {
        "_unknown_": 0.0059609693, 
        "left": 0.17037454, 
        "right": 0.82339555
      }, 
      "status": 200
    }
    

    我在这里用过Flask==1.0.2

    几个观察:

    1. 不要使用dict 作为变量名。它是一个 python 关键字。

    2. 在编写代码时遵循PEP8 标准。

    3. 不要在代码中保留尾随空格。

    【讨论】:

    • 如果我的字典对象是动态创建的,它就不起作用。 # 按置信度排序以显示标签 top_k = predictions.argsort()[-num_top_predictions:][::-1] result = {} for node_id in top_k: human_string = labels[node_id] score = predictions[node_id] result[ human_string] = score print(type(result)) 它打印
    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多