【发布时间】:2018-02-10 20:59:14
【问题描述】:
我正在使用 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) 返回解决方案而不是 {'solution': solution}
2)做jsonify(解决方案)
3) 做 jsonify(**solution)
以上都不适合我; 我想知道为什么会发生这种情况,当我试图返回一个有效的字典时:
{'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'}
感谢任何帮助。 谢谢
【问题讨论】:
-
solution的类型是什么?你能print type(solution)和print repr(solution)分享输出吗? -
soltuin['flights][0][0] ('dict'-) 里面的解决方案不是 dict 类型,而是 'Thesis. modules.Flight.Flight'> 我想这是错误,关于如何修复它的任何建议? @smarx
-
是的,这听起来像是个问题。要么实现自定义
JSONEncoder,要么先将数据转换为 JSON 可序列化的内容。 -
顺便说一句,该类型是返回以下内容的结果: def __repr__(self): #logger.info('INSIDE REPR') # return "origin: {}, destination: {} , 日期: {}, 价格: {} url: {}".format(# self._origin, self._dest, self._date, self._price, self._url) f_dict = { "origin": self._origin[ 0], "dest": self._dest[0], "date": self._date, "price": self._price, "url": self._url } return str(f_dict) 我想返回一个字典,但是python不允许,所以我用str
-
当然,
__repr__必须返回str,但我不明白这与您遇到的问题有什么关系。
标签: json flask notserializableexception