json.dumps vs flask.jsonify


277

Non sono sicuro di aver capito lo scopo del flask.jsonifymetodo. Provo a creare una stringa JSON da questo:

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

ma ciò che ottengo json.dumpsdifferisce da ciò che ottengo flask.jsonify.

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

Ovviamente ho bisogno di ottenere un risultato che assomigli di più a ciò che json.dumpsritorna. Che cosa sto facendo di sbagliato?

Risposte:


370

La jsonify()funzione in pallone restituisce un flask.Response()oggetto che ha già l'intestazione del tipo di contenuto 'application / json' appropriata da utilizzare con le risposte json. Mentre iljson.dumps() metodo restituirà solo una stringa codificata, che richiederebbe l'aggiunta manuale dell'intestazione del tipo MIME.

Vedi di più sulla jsonify()funzione qui per un riferimento completo.

Modifica: Inoltre, ho notato che jsonify()gestisce kwarg o dizionari, mentre json.dumps()supporta anche elenchi e altri.


31
jsonify()gestisce gli elenchi ora. Vedi questo commit .
Jeff Widman,

3
Ma non trasforma ancora gli oggetti e gli elenchi SQLAlchemy in JSON.
Ajbraus,

91

Tu puoi fare:

flask.jsonify(**data)

o

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

82

Questo è 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')

Il jsonmodulo utilizzato è simplejsono jsonin quell'ordine. current_appè un riferimento Flask()all'oggetto, ad esempio l'applicazione. response_class()è un riferimento alla Response()classe.


42

La scelta dell'uno o dell'altro dipende da ciò che si intende fare. Da quello che capisco:

  • jsonify sarebbe utile quando si crea un'API che qualcuno interrogherebbe e si aspetterebbe in cambio json. Ad esempio: l'API github REST potrebbe utilizzare questo metodo per rispondere alla tua richiesta.

  • dump , si tratta più di formattare l'oggetto data / python in json e lavorarci su all'interno dell'applicazione. Ad esempio, devo passare un oggetto al mio livello di rappresentazione in cui alcuni javascript visualizzeranno il grafico. Alimenterai javascript con il Json generato dai dump.


4
Non capisco affatto la differenza.
vidstige,

11
@vidstige: jsonify crea un oggetto flask.Response () con le intestazioni impostate come "content-type: application / json", il suo payload impostato come dict convertito in stringa JSON. dump crea semplicemente una stringa convertita in JSON. Non è un oggetto flask.Response () correttamente formattato. Quindi se la tua vista dice "return json.dumps (dict)", il destinatario riceverà semplicemente una risposta "content-type: text / html" normale con l'output json.dumps come payload.
SamEsla,

3
@SamEsla sì, lo so, ma nessuna di queste informazioni è contenuta in questa risposta.
vidstige,

0

tener conto di

data={'fld':'hello'}

adesso

jsonify(data)

produrrà {'fld': 'ciao'} e

json.dumps(data)

"<html><body><p>{'fld':'hello'}</p></body></html>"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.