Flask TypeError 'is not JSON serializable' - 嵌套字典
Flask TypeError 'is not JSON serializable' - nested dictionary
我正在使用 Flask 作为我的服务器的框架,当 return 收到响应时我收到以下错误:
> 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) return 解决方案而不是 {'solution': 解决方案}
2) 做 jsonify(解决方案)
3) 做 jsonify(**解决方案)
以上的 none 对我有用;
我想知道为什么会这样,当我试图 return 一个有效的字典时:
{'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'}
感谢任何帮助。
谢谢
由于你的大部分函数都在别处声明,我编写了一个玩具 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'}
以下程序运行,returns 字典作为 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()
我在使用 3 级嵌套字典时遇到了同样的问题;它是有效的,json 可序列化并且通过命令行 json.dumps 没有问题。但是,Flask 并不想输出它:"TypeError",不是json serializable。唯一的区别是我使用的是 Python 3.5.
所以我将它复制为一个字符串(在命令行上是 json 可序列化的!)并传递给 Flask 输出,它起作用了。
尝试将嵌套的 json 作为
eval(str(solution))
并查看错误。这不是最终的解决方案,而是一种解决方法。
希望对您有所帮助。
在flask-restful中,资源classget方法只需要returnpython数据结构。所以只需删除 jsonify
。对于用户定义对象,您可以使用 marshal_with()
装饰器。
查看更多:https://flask-restful.readthedocs.io/en/latest/quickstart.html#a-minimal-api
据我所知,当响应不是纯 python 字典时,通常会发生此错误。这发生在我身上是因为我试图传递一个 class 对象。所以,为了解决这个问题,我创建了一个 class 方法,其中 returns 一个描述对象的字典,并使用它来创建 json 响应。
结论:使用纯 python 对象,很容易转换为 JSON。
我的猜测是当您创建 'solution' 时,分配给它的数据是一个格式不正确的字典
{'item', 'value'}
而不是:
{'item': 'value'}
因此创建一个集合而不是字典
当您尝试将数据列表转换为 json 时,我们无法直接使用 jsonify。
有两种方法可以将列表转换为字典,因为我们需要编写将列表数据转换为字典的函数,这是一项复杂的任务。
有一项聪明的工作可以使用 Marshmallow 库。它序列化你列出数据之后你可以使用 jsonify.
我正在使用 Flask 作为我的服务器的框架,当 return 收到响应时我收到以下错误:
> 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) return 解决方案而不是 {'solution': 解决方案}
2) 做 jsonify(解决方案)
3) 做 jsonify(**解决方案)
以上的none 对我有用; 我想知道为什么会这样,当我试图 return 一个有效的字典时:
{'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'}
感谢任何帮助。 谢谢
由于你的大部分函数都在别处声明,我编写了一个玩具 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'}
以下程序运行,returns 字典作为 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()
我在使用 3 级嵌套字典时遇到了同样的问题;它是有效的,json 可序列化并且通过命令行 json.dumps 没有问题。但是,Flask 并不想输出它:"TypeError",不是json serializable。唯一的区别是我使用的是 Python 3.5.
所以我将它复制为一个字符串(在命令行上是 json 可序列化的!)并传递给 Flask 输出,它起作用了。
尝试将嵌套的 json 作为
eval(str(solution))
并查看错误。这不是最终的解决方案,而是一种解决方法。
希望对您有所帮助。
在flask-restful中,资源classget方法只需要returnpython数据结构。所以只需删除 jsonify
。对于用户定义对象,您可以使用 marshal_with()
装饰器。
查看更多:https://flask-restful.readthedocs.io/en/latest/quickstart.html#a-minimal-api
据我所知,当响应不是纯 python 字典时,通常会发生此错误。这发生在我身上是因为我试图传递一个 class 对象。所以,为了解决这个问题,我创建了一个 class 方法,其中 returns 一个描述对象的字典,并使用它来创建 json 响应。
结论:使用纯 python 对象,很容易转换为 JSON。
我的猜测是当您创建 'solution' 时,分配给它的数据是一个格式不正确的字典
{'item', 'value'}
而不是:
{'item': 'value'}
因此创建一个集合而不是字典
当您尝试将数据列表转换为 json 时,我们无法直接使用 jsonify。 有两种方法可以将列表转换为字典,因为我们需要编写将列表数据转换为字典的函数,这是一项复杂的任务。 有一项聪明的工作可以使用 Marshmallow 库。它序列化你列出数据之后你可以使用 jsonify.