Flask TypeError'不是JSON可序列化的' - 嵌套字典

时间:2017-09-01 18:41:49

标签: json flask notserializableexception

我使用Flask作为我的服务器的框架,并在返回响应时收到以下错误:

> Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Python27\lib\site-packages\flask\app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Python27\lib\site-packages\flask_restful\__init__.py", line 480, in wrapper
    resp = resource(*args, **kwargs)
  File "C:\Python27\lib\site-packages\flask\views.py", line 84, in view
    return self.dispatch_request(*args, **kwargs)
  File "C:\Python27\lib\site-packages\flask_restful\__init__.py", line 595, in dispatch_request
    resp = meth(*args, **kwargs)
  File "rest.py", line 27, in get
    return jsonify(**solution)
  File "C:\Python27\lib\site-packages\flask\json.py", line 263, in jsonify
    (dumps(data, indent=indent, separators=separators), '\n'),
  File "C:\Python27\lib\site-packages\flask\json.py", line 123, in dumps
    rv = _json.dumps(obj, **kwargs)
  File "C:\Python27\lib\json\__init__.py", line 251, in dumps
    sort_keys=sort_keys, **kw).encode(obj)
  File "C:\Python27\lib\json\encoder.py", line 209, in encode
    chunks = list(chunks)
  File "C:\Python27\lib\json\encoder.py", line 434, in _iterencode
    for chunk in _iterencode_dict(o, _current_indent_level):
  File "C:\Python27\lib\json\encoder.py", line 408, in _iterencode_dict
    for chunk in chunks:
  File "C:\Python27\lib\json\encoder.py", line 332, in _iterencode_list
    for chunk in chunks:
  File "C:\Python27\lib\json\encoder.py", line 332, in _iterencode_list
    for chunk in chunks:
  File "C:\Python27\lib\json\encoder.py", line 442, in _iterencode
    o = _default(o)
  File "C:\Python27\lib\site-packages\flask\json.py", line 80, in default
    return _json.JSONEncoder.default(self, o)
  File "C:\Python27\lib\json\encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: {'origin': u'porto', 'dest': u'lisboa', 'price': '31', 'date': '2017-12-23', 'url': u'https://www.google.pt/flights/#search;f=opo;t=lis;d=2017-12-23;r=2017-12-24'} is not JSON serializable

我有以下功能:

from flask import Flask, request, jsonify
from flask_restful import Resource, Api
from flask_cors import CORS, cross_origin
from json import dumps
import flights
import solveProblem

app = Flask(__name__)
api = Api(app)
CORS(app)

class Flights(Resource):
    def get(self, data):
        print 'received data from client: ' + data
        solution = solveProblem.solve(data)
        print 'got the solution from the script! \nSOLUTION: \n'
        print solution
        return jsonify(solution)

api.add_resource(Flights, '/flights/<string:data>')

if __name__ == '__main__':
    app.run()

在调试问题时,我发现以下解决方案无效:

1)返回解决方案,而不是{&#39;解决方案&#39;解决方案}

2)做jsonify(解决方案)

3)做jsonify(**解决方案)

以上都没有为我工作; 我想知道为什么会发生这种情况,当我试图返回一个有效的字典时:

{'flights': [[{'origin': u'porto', 'dest': u'lisboa', 'price': '31', 'date': '2017-12-23', 'url': u'https://www.google.pt/flights/#search;f=opo;t=lis;d=2017-12-23;r=2017-12-24'}]], 'cost': '31'}

任何帮助表示赞赏。 感谢

6 个答案:

答案 0 :(得分:2)

我的猜测是,当您创建“解决方案”时,分配给它的数据是格式错误的字典

    {'item', 'value'}

代替:

    {'item': 'value'}

因此创建集合而不是字典

答案 1 :(得分:0)

由于你的大部分功能都是在其他地方宣布的,所以我使用了一个玩具Flask程序只是为了传递你坚持使用的词典。 [编辑]在我使用标准的python json模块之前。我编辑它以使用flask自己的jsonify,而它的工作原理仍然是直接字典。所以错误不是OP寻找的地方。

 {'flights': [[{'origin': u'porto', 'dest': u'lisboa', 'price': '31', 'date': '2017-12-23', 'url': u'https://www.google.pt/flights/#search;f=opo;t=lis;d=2017-12-23;r=2017-12-24'}]], 'cost': '31'}

以下程序运行并将字典作为JSON对象返回:

import flask

app = flask.Flask(__name__)

@app.route('/')
def hello():
    jdic = flask.jsonify( {'origin': u'porto', 'dest': u'lisboa', 'price': '31', 'date': '2017-12-23', 'url': u'https://www.google.pt/flights/#search;f=opo;t=lis;d=2017-12-23;r=2017-12-24'} )
    return jdic

if __name__ == '__main__':
    app.run()

答案 2 :(得分:0)

flask-restful 中,Resource类的get方法只需要返回python data structrue。所以只需删除josonify即可。对于用户定义的对象,您可以使用marshal_with()装饰器。 查看更多:https://flask-restful.readthedocs.io/en/latest/quickstart.html#a-minimal-api

答案 3 :(得分:0)

当您尝试将数据列表转换为JSON时,我们无法直接使用jsonify
有两种方法。
首先,您可以将列表转换为字典,为此我们需要编写一个函数,将列表数据转换为字典,这是一项复杂的任务。
您可以使用棉花糖库进行一项巧妙的工作。在可以使用jsonify之后,它将序列化列出数据。

答案 4 :(得分:-1)

我对3级嵌套字典有同样的问题;它是有效的,json序列化和通过命令行json.dumps没有问题。但是,Flask不想输出它:&#34; TypeError&#34;,而不是json serializable。唯一的区别是我使用的是Python 3.5。

所以我把它复制成一个字符串(在命令行上是json serializable!)并传递给Flask输出,它工作正常。

尝试将嵌套的json传递为

eval(str(solution))

并查看错误。它不是一个明确的解决方案,而是更多的解决方法。

希望它有所帮助。

答案 5 :(得分:-2)

正如我发现的那样,当响应不是纯python字典时,通常会发生此错误。这发生在我身上,因为我试图传递一个类对象。因此,为了解决这个问题,我创建了一个类方法,它返回一个描述该对象的字典,并使用它来创建json响应。

结论:使用Pure python对象,它们很容易转换为JSON。