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?

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.


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)

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.


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.


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>"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.