Я использую 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) вернуть решение вместо {'решение': решение}

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'}

Любая помощь приветствуется. Спасибо

3
Rafael Marques 1 Сен 2017 в 21:41

6 ответов

Лучший ответ

Как я выяснил, эта ошибка обычно возникает, когда ответ не является чистым словарем Python. Это случилось со мной, потому что я пытался передать объект класса. Итак, чтобы решить проблему, я создал метод класса, который возвращает словарь, описывающий объект, и использую его для создания ответа json.

Вывод: используйте объекты Pure Python, которые легко переводятся в JSON.

-3
Rafael Marques 10 Апр 2018 в 23:02

В flask-restful метод get класса Resource просто должен вернуть структуру данных Python. Так что просто удалите josonify. Для пользовательского объекта вы можете использовать декоратор marshal_with(). Подробнее: https: //flask-restful.readthedocs .io / о / последний / quickstart.html # а- минимал- апи

0
Saurabh Bhandari 23 Янв 2018 в 06:19

Мы не можем напрямую использовать jsonify, когда вы пытаетесь преобразовать список данных в JSON.
Есть два подхода.
Во-первых, вы можете преобразовать список в словарь, для этого нам нужно написать функцию, которая преобразует данные вашего списка в словарь, что является сложной задачей.
Есть одна умная работа, которую вы можете использовать библиотеку Marshmallow. Он сериализует данные списка, после чего вы можете использовать jsonify.

0
PatrickChen 16 Май 2020 в 13:55

Поскольку большинство ваших функций объявлено в другом месте, я разработал игрушечную программу Flask, чтобы передать словарь, с которым вы застряли. [Edit] Прежде чем я использовал стандартный модуль Python JSON. Я отредактировал его, чтобы использовать собственный 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'}

Следующая программа запускается и возвращает словарь в виде объекта 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()
-1
oldMammuth 2 Сен 2017 в 15:21

У меня была такая же проблема с 3-уровневым вложенным словарем; это было допустимо, json сериализуемо и через командную строку json.dumps не имеет проблем. Однако Flask не хотел выводить его: «TypeError», а не json, сериализуемый. Разница лишь в том, что я использую Python 3.5.

Поэтому я сделал его копию в виде строки (которую в командной строке можно было сериализовать с помощью json!) И передал на выход Flask, это сработало.

Попробуйте передать вложенный JSON как

eval(str(solution))

И вижу ошибку. Это не окончательное решение, а скорее обходной путь.

Надеюсь, это поможет.

-3
Filippo Mazza 5 Дек 2017 в 11:33

Я предполагаю, что когда вы создавали «решение», данные, которые были ему присвоены, были неправильно отформатированным словарем.

    {'item', 'value'}

Вместо:

    {'item': 'value'}

Таким образом, создавая набор вместо диктата

1
PlantDaddy 30 Мар 2020 в 20:39