json.dumps vs flask.jsonify

276

Ich bin nicht sicher, ob ich den Zweck der flask.jsonifyMethode verstehe . Ich versuche daraus einen JSON-String zu machen:

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

Aber was ich bekomme, json.dumpsunterscheidet sich von dem, was ich bekomme flask.jsonify.

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

Natürlich muss ich ein Ergebnis json.dumpserzielen , das eher dem entspricht, was zurückkommt. Was mache ich falsch?

Sergei Basharov
quelle

Antworten:

369

Die jsonify()Funktion in flask gibt ein flask.Response()Objekt zurück, das bereits den entsprechenden Inhaltstyp-Header 'application / json' zur Verwendung mit json-Antworten hat. Während die json.dumps()Methode nur eine codierte Zeichenfolge zurückgibt, müsste der Header vom Typ MIME manuell hinzugefügt werden.

Weitere Informationen zur jsonify()Funktion finden Sie hier .

Bearbeiten: Außerdem habe ich festgestellt, dass jsonify()kwargs oder Wörterbücher behandelt werden, während json.dumps()zusätzlich Listen und andere unterstützt werden.

Kenneth Wilke
quelle
31
jsonify()behandelt jetzt Listen. Siehe dieses Commit .
Jeff Widman
3
SQLAlchemy-Objekte und -Listen werden jedoch immer noch nicht in JSON umgewandelt.
Ajbraus
91

Du kannst tun:

flask.jsonify(**data)

oder

flask.jsonify(id=str(album.id), title=album.title)
mikerobi
quelle
82

Das ist 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')

Das verwendete jsonModul ist entweder simplejsonoder jsonin dieser Reihenfolge. current_appist ein Verweis auf das Flask()Objekt, dh Ihre Anwendung. response_class()ist ein Verweis auf die Response()Klasse.

Michael Ekoka
quelle
42

Die Wahl des einen oder anderen hängt davon ab, was Sie vorhaben. Soweit ich weiß:

  • jsonify ist nützlich, wenn Sie eine API erstellen, die jemand abfragt und als Gegenleistung json erwartet. Beispiel: Die REST-Github-API könnte diese Methode verwenden, um Ihre Anfrage zu beantworten.

  • Bei Dumps geht es mehr darum, Daten / Python-Objekte in JSON zu formatieren und in Ihrer Anwendung daran zu arbeiten. Zum Beispiel muss ich ein Objekt an meine Darstellungsebene übergeben, in der Javascript Diagramme anzeigt. Sie füttern Javascript mit dem von Dumps generierten Json.

Chaiyachaiya
quelle
4
Ich verstehe den Unterschied überhaupt nicht.
Vidstige
11
@vidstige: jsonify erstellt ein flask.Response () -Objekt, dessen Header auf "content-type: application / json" festgelegt sind und dessen Nutzdaten auf das in JSON-Zeichenfolgen konvertierte Diktat festgelegt sind. Dumps erstellt einfach eine in JSON konvertierte Zeichenfolge. Es ist kein richtig formatierter Kolben. Response () -Objekt. Wenn Ihre Ansicht also "return json.dumps (dict)" lautet, erhält der Empfänger nur eine reguläre Antwort "content-type: text / html" mit der Ausgabe von json.dumps als Nutzlast.
SamEsla
3
@ SamEsla Ja, ich weiß, aber keine dieser Informationen ist in dieser Antwort enthalten.
vidstige
0

Erwägen

data={'fld':'hello'}

jetzt

jsonify(data)

ergibt {'fld': 'hallo'} und

json.dumps(data)

gibt

"<html><body><p>{'fld':'hello'}</p></body></html>"
Govind Kelkar
quelle