json.dumps vs flask.jsonify


276

Я не впевнений, що розумію мету 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повертається. Що я роблю неправильно?

Відповіді:


369

jsonify()Функція в колбі повертає flask.Response()об'єкт , який вже має відповідний зміст заголовок типу «додатки / JSON» для використання з відповідями JSon. Тоді як json.dumps()метод просто поверне кодований рядок, який вимагатиме додавання заголовка типу MIME вручну.

Детальну інформацію про jsonify()функцію див. Тут для повної посилання.

Редагувати: Також я помітив, що jsonify()обробляє kwargs або словники, а json.dumps()додатково підтримує списки та інші.


31
jsonify()зараз обробляє списки. Дивіться цю прихильність .
Джефф Відман

3
Але це все ще не перетворює об'єкти та списки SQLAlchemy в JSON.
айбраус


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 може використовувати цей метод, щоб відповісти на ваш запит.

  • дампс , більше стосується формування даних / об’єкта python в json та роботи над ним всередині вашої програми. Наприклад, мені потрібно передати об’єкт на мій рівень представлення, де деякий javascript буде відображати графік. Ви подаватимете JavaScript за допомогою Json, що генерується відвалами.


4
Я взагалі не розумію різниці.
vidstige

11
@vidstige: jsonify робить об'єкт flask.Response () із заголовками, встановленими як "тип вмісту: application / json", а його корисне навантаження - як диктат, перетворений у JSON. dumps просто робить перетворений в JSON-рядок. Це не правильно відформатований об'єкт flask.Response (). Отже, якщо у вашому погляді написано "return json.dumps (dict)", то одержувач просто отримає звичайну відповідь "content-type: text / html" з виведенням json.dumps як корисного навантаження.
SamEsla

3
@SamEsla так, я знаю, але жодна з цих даних не відповідає в цій відповіді.
vidstige

0

розглянути

data={'fld':'hello'}

зараз

jsonify(data)

дасть {'fld': 'привіт'} і

json.dumps(data)

дає

"<html><body><p>{'fld':'hello'}</p></body></html>"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.