json.dumps vs flask.jsonify

277

Я не уверен, что понимаю цель flask.jsonify метода. Я пытаюсь сделать строку JSON из этого:

data = {"id": str(album.id), "title": album.title}

но то, что я получаю, json.dumpsотличается от того, что я получаю flask.jsonify.

json.dumps(data): [{"id": "4ea856fd6506ae0db42702dd", "title": "Business"}]
flask.jsonify(data): {"id":…, "title":…}

Очевидно, мне нужно получить результат, который больше похож на json.dumpsрезультат. Что я делаю не так?

Сергей Башаров
источник

Ответы:

370

jsonify()Функция в колбе возвращает flask.Response()объект , который уже имеет соответствующее содержание заголовок типа «приложения / JSON» для использования с ответами JSon. Принимая во внимание, чтоjson.dumps() метод будет просто возвращать закодированную строку, что потребует добавления заголовка MIME-типа вручную.

Смотрите больше о jsonify()функции здесь для полной справки.

Изменить: Кроме того, я заметил, что jsonify()обрабатывает kwargs или словари, в то время как json.dumps()дополнительно поддерживает списки и другие.

Кеннет Уилк
источник
31
jsonify()обрабатывает списки сейчас. Смотрите этот коммит .
Джефф Видман
3
Но это все еще не превращает объекты и списки SQLAlchemy в JSON.
Айбраус
91

Ты можешь сделать:

flask.jsonify(**data)

или

flask.jsonify(id=str(album.id), title=album.title)
mikerobi
источник
82

Это flask.jsonify()

def jsonify(*args, **kwargs):
    if __debug__:
        _assert_have_json()
    return current_app.response_class(json.dumps(dict(*args, **kwargs),
        indent=None if request.is_xhr else 2), mimetype='application/json')

jsonМодуль используется либо simplejsonили jsonв таком порядке. current_appявляется ссылкой на Flask()объект, т.е. ваше приложение. response_class()это ссылка на Response()класс.

Майкл Экока
источник
42

Выбор того или другого зависит от того, что вы намерены делать. Из того, что я понимаю:

  • jsonify будет полезен, когда вы создаете API, кто-то будет запрашивать и ожидать json в ответ. Например: API REST github может использовать этот метод для ответа на ваш запрос.

  • dumps , больше о форматировании объекта data / python в json и работе над ним внутри вашего приложения. Например, мне нужно передать объект на мой уровень представления, где какой-то JavaScript будет отображать график. Вы добавите в Javascript Json, созданный дампами.

chaiyachaiya
источник
4
Я не понимаю разницу вообще.
Виджет
11
@vidstige: jsonify создает объект flask.Response (), заголовки которого установлены как «content-type: application / json», а его полезная нагрузка - как преобразованный в JSON-string dict. dumps просто создает преобразованную в JSON-строку. Это не правильно отформатированный объект flask.Response (). Поэтому, если ваше представление говорит «return json.dumps (dict)», то получатель просто получит обычный ответ «content-type: text / html» с выводом json.dumps в качестве полезной нагрузки.
СамЭсла
3
@ SamEsla да, я знаю, но ни одна из этой информации не содержится в этом ответе.
виджет
0

рассматривать

data={'fld':'hello'}

сейчас

jsonify(data)

выдаст {'fld': 'hello'} и

json.dumps(data)

дает

"<html><body><p>{'fld':'hello'}</p></body></html>"
Говинд Келкар
источник