烧瓶类型错误'is not JSON serializable' - 嵌套字典



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

> Traceback (most recent call last):
  File "C:Python27libsite-packagesflaskapp.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:Python27libsite-packagesflaskapp.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:Python27libsite-packagesflask_restful__init__.py", line 480, in wrapper
    resp = resource(*args, **kwargs)
  File "C:Python27libsite-packagesflaskviews.py", line 84, in view
    return self.dispatch_request(*args, **kwargs)
  File "C:Python27libsite-packagesflask_restful__init__.py", line 595, in dispatch_request
    resp = meth(*args, **kwargs)
  File "rest.py", line 27, in get
    return jsonify(**solution)
  File "C:Python27libsite-packagesflaskjson.py", line 263, in jsonify
    (dumps(data, indent=indent, separators=separators), 'n'),
  File "C:Python27libsite-packagesflaskjson.py", line 123, in dumps
    rv = _json.dumps(obj, **kwargs)
  File "C:Python27libjson__init__.py", line 251, in dumps
    sort_keys=sort_keys, **kw).encode(obj)
  File "C:Python27libjsonencoder.py", line 209, in encode
    chunks = list(chunks)
  File "C:Python27libjsonencoder.py", line 434, in _iterencode
    for chunk in _iterencode_dict(o, _current_indent_level):
  File "C:Python27libjsonencoder.py", line 408, in _iterencode_dict
    for chunk in chunks:
  File "C:Python27libjsonencoder.py", line 332, in _iterencode_list
    for chunk in chunks:
  File "C:Python27libjsonencoder.py", line 332, in _iterencode_list
    for chunk in chunks:
  File "C:Python27libjsonencoder.py", line 442, in _iterencode
    o = _default(o)
  File "C:Python27libsite-packagesflaskjson.py", line 80, in default
    return _json.JSONEncoder.default(self, o)
  File "C:Python27libjsonencoder.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)返回解决方案而不是{'solution':solution}

2)do 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'}

任何帮助将不胜感激。谢谢

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

    {'item', 'value'}

而不是:

    {'item': 'value'}

因此创建一个集,而不是dict

当您尝试将数据列表转换为JSON时,我们无法直接使用JSONIFY。有两种方法,您可以将列表转换为字典,因为我们需要编写将您的列表数据转换为词典的功能,这是复杂的任务。您可以使用一项聪明的作品,可以使用棉花糖库。在您可以使用JSONIFY之后列出数据。

flask-restful 中,资源类获取方法只需要返回Python数据结构即可。因此,只需删除jsonify即可。对于用户定义的对象,您可以使用marshal_with()装饰器。请参阅更多:https://flask-restful.readthedocs.io/en/latest/quickstart.html#a-minimal-api

由于您的大多数功能在其他地方声明了,所以我工作了一个玩具瓶程序,只是通过您被卡住的字典。[编辑]在使用标准Python JSON模块之前。我对其进行了编辑以使用烧瓶自己的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()

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

结论:使用纯Python对象,这些对象很容易翻译成Json。

我在3级嵌套词典中也有相同的问题;它是有效的,可序列化的,并且通过命令行json.dumps没有问题。但是,烧瓶不想输出它:" TypeError",而不是JSON可序列化。唯一的区别是我正在使用Python 3.5。

所以我将其副本作为字符串(命令行上的json序列化!)并传递给了烧瓶输出。

尝试通过嵌套的JSON作为

eval(str(solution))

并查看错误。这不是确定的解决方案,而是解决方法。

希望它有帮助。

相关内容

  • 没有找到相关文章

最新更新