Python Flask:如何将字典对象转换为JSON?

4

我是一个刚接触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

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


这个评论来得有点晚,但我认为使用dict作为变量名是一个不好的主意,可能会被Python误解为类型名,而不是字典。而且它可能无法将原生类型序列化为JSON。只是说一下,因为其他回答中没有明确提到这一点。 - undefined
2个回答

6

这段代码对我来说运行得很好。请看下面的示例服务器代码:

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
}

2
dict执行json.dumps,然后再执行jsonify(message)会导致dictjsonify两次,你确定这是正确的做法吗? - Sushant
@ThatBird已更新 - Pankaj Singhal

0

当您尝试将不是纯Python字典的内容转换为JSON时会出现此错误。因此,请使用纯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)) 它打印出<class 'dict'>。
- Paras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接