Json.dumps vs flask.jsonify

Я не уверен, что понимаю цель метода 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. Что я делаю неправильно?

Ответ 1

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

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

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

Ответ 2

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

flask.jsonify(**data)

или

flask.jsonify(id=str(album.id), title=album.title)

Ответ 3

Это 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().

Ответ 4

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

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

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