json.dumps vs flask.jsonify

277

Saya tidak yakin saya mengerti tujuan dari flask.jsonifymetode ini. Saya mencoba membuat string JSON dari ini:

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

tetapi apa yang saya dapatkan json.dumpsberbeda dari apa yang saya dapatkan flask.jsonify.

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

Jelas saya perlu mendapatkan hasil yang lebih mirip apa yang json.dumpskembali. Apa yang saya lakukan salah?

Sergei Basharov
sumber

Jawaban:

370

The jsonify()fungsi dalam termos mengembalikan flask.Response()objek yang sudah memiliki yang sesuai konten-tipe header 'aplikasi / json' untuk digunakan dengan tanggapan json. Sedangkan, json.dumps()metode hanya akan mengembalikan string yang disandikan, yang akan membutuhkan menambahkan header tipe MIME secara manual.

Lihat lebih lanjut tentang jsonify()fungsi di sini untuk referensi lengkap.

Sunting: Juga, saya perhatikan bahwa jsonify()menangani kwargs atau kamus, sementara json.dumps()juga mendukung daftar dan lainnya.

Kenneth Wilke
sumber
31
jsonify()menangani daftar sekarang. Lihat komit ini .
Jeff Widman
3
Tapi itu masih tidak mengubah objek dan daftar SQLAlchemy menjadi JSON.
ajbraus
91

Anda dapat melakukan:

flask.jsonify(**data)

atau

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

Ini adalah 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')

The jsonModul yang digunakan adalah baik simplejsonatau jsondalam urutan itu. current_appadalah referensi ke Flask()objek yaitu aplikasi Anda. response_class()adalah referensi ke Response()kelas.

Michael Ekoka
sumber
42

Pilihan satu atau yang lain tergantung pada apa yang ingin Anda lakukan. Dari apa yang saya mengerti:

  • jsonify akan berguna ketika Anda sedang membangun API yang akan ditanyakan seseorang dan mengharapkan json sebagai imbalan. Misalnya: API github REST dapat menggunakan metode ini untuk menjawab permintaan Anda.

  • kesedihan , lebih lanjut tentang memformat objek data / python ke json dan bekerja di dalamnya di dalam aplikasi Anda. Sebagai contoh, saya perlu mengirimkan objek ke lapisan representasi saya di mana beberapa javascript akan menampilkan grafik. Anda akan memberi makan javascript dengan Json yang dihasilkan oleh dump.

chaiyachaiya
sumber
4
Saya tidak mengerti bedanya sama sekali.
vidstige
11
@vidstige: jsonify membuat objek flask.Response () dengan header-nya ditetapkan sebagai "content-type: application / json", payload-nya ditetapkan sebagai dikt string yang dikonversi menjadi JSON-string. kesedihan hanya membuat string-dikonversi ke-JSON. Ini bukan objek flask.Response () yang diformat dengan benar. Jadi jika pandangan Anda mengatakan "return json.dumps (dict)", maka penerima hanya akan mendapatkan respons "content-type: text / html" reguler dengan output json.dumps sebagai payload.
SamEsla
3
@ SamEsla ya, saya tahu, tetapi tidak ada informasi yang ada dalam jawaban ini.
vidstige
0

mempertimbangkan

data={'fld':'hello'}

sekarang

jsonify(data)

akan menghasilkan {'fld': 'hello'} dan

json.dumps(data)

memberi

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