Apa perbedaan antara json.dump () dan json.dumps () dalam python?


131

Saya mencari di dokumen resmi ini untuk menemukan perbedaan antara json.dump () dan json.dumps () dalam python. Jelas bahwa mereka terkait dengan opsi penulisan file.
Tetapi apa perbedaan terperinci antara mereka dan dalam situasi apa seseorang memiliki lebih banyak keunggulan daripada yang lain?

Jawaban:


146

Tidak banyak yang bisa ditambahkan selain dari apa yang dikatakan dokumen. Jika Anda ingin membuang JSON ke file / socket atau apa pun, maka Anda harus menggunakannya dump(). Jika Anda hanya membutuhkannya sebagai string (untuk mencetak, parsing atau apa pun) maka gunakan dumps()(dump string)

Seperti yang disebutkan oleh Antii Haapala dalam jawaban ini , ada beberapa perbedaan kecil pada ensure_asciiperilaku. Hal ini sebagian besar disebabkan oleh bagaimana write()fungsi yang mendasarinya bekerja, karena ia beroperasi pada chunks daripada seluruh string. Periksa jawabannya untuk perincian lebih lanjut tentang itu.

json.dump()

Serialize obj sebagai stream yang diformat JSON ke fp (a .write () - mendukung objek seperti file

Jika sure_ascii False, beberapa chunks yang ditulis ke fp mungkin merupakan instance unicode

json.dumps()

Serialize obj ke str diformat JSON

Jika sure_ascii False, hasilnya mungkin berisi karakter non-ASCII dan nilai kembaliannya bisa berupa instance unicode


Bisakah Anda menunjukkan contoh cara menggunakan dump () untuk mengirim melalui soket? Saya tahu bahwa saya dapat menggunakan dumps () dan daripada encode () untuk mengkonversi ke byte, tetapi apakah ada cara yang lebih pendek?
Anak laki


20

Dalam penggunaan memori dan kecepatan.

Saat Anda memanggilnya jsonstr = json.dumps(mydata)pertama-tama buat salinan lengkap data Anda dalam memori dan hanya Anda yang file.write(jsonstr)memasukkannya ke disk. Jadi ini adalah metode yang lebih cepat tetapi bisa menjadi masalah jika Anda memiliki banyak data untuk disimpan.

Ketika Anda menelepon json.dump(mydata, file)- tanpa 's', memori baru tidak digunakan, karena data dibuang oleh potongan. Tetapi keseluruhan prosesnya sekitar 2 kali lebih lambat.

Sumber: Saya memeriksa kode sumber json.dump()dan json.dumps()dan juga menguji kedua varian yang mengukur waktu dengan time.time()dan menonton penggunaan memori di htop.


6

Satu perbedaan penting dalam Python 2 adalah bahwa jika Anda menggunakan ensure_ascii=False, dumpakan dengan benar menulis data yang dikodekan UTF-8 ke dalam file (kecuali jika Anda menggunakan string 8-bit dengan karakter diperluas yang bukan UTF-8):

dumpsdi sisi lain, dengan ensure_ascii=Falsedapat menghasilkan stratau unicodehanya tergantung pada jenis apa yang Anda gunakan untuk string:

Serialize obj ke str diformat JSON menggunakan tabel konversi ini. Jika sure_ascii False, hasilnya mungkin berisi karakter non-ASCII dan nilai kembaliannya bisa menjadi unicodecontoh .

(penekanan milikku). Perhatikan bahwa itu mungkin masih menjadi strcontoh juga.

Dengan demikian Anda tidak dapat menggunakan nilai baliknya untuk menyimpan struktur ke dalam file tanpa memeriksa format yang dikembalikan dan kemungkinan diputar unicode.encode.

Hal ini tentu saja bukan perhatian yang valid di Python 3 lagi, karena tidak ada lagi kebingungan 8-bit / Unicode ini.


Adapun loadvs loads, loadmenganggap seluruh file sebagai satu dokumen JSON, jadi Anda tidak dapat menggunakannya untuk membaca beberapa dokumen JSON terbatas baris baru dari satu file.


Semua teks yang dibuat dalam objek string python adalah unicode, tetapi apakah aman untuk menganggapnya secara umum? yaitu kapan memuat konten dari file?
João Gonçalves

@ JoãoGalçalves artinya Anda tidak dapat mencampur data biner dengan teks sehingga python menyetujuinya secara diam-diam. misalnya json.dumps([b'123'])-> TypeError.
Antti Haapala

@ JoãoGonçalves juga mencatat bahwa string dalam dokumen JSON harus Unicode , dan harus dalam UTF-8, UTF-16 atau UTF-32 menurut RFC 7159
Antti Haapala

1
Terima kasih untuk penjelasannya! Masuk akal
João Gonçalves
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.