Membaca dan Menulis JSON ke File dengan Python

Pengantar

Dalam panduan ini, kita akan melihat cara membaca dan menulis data JSON dari dan ke file dengan Python, menggunakan json modul.

JSON (Notasi Objek JavaScript) adalah format yang sangat populer untuk serialisasi data, mengingat seberapa umum dan ringan aplikasinya โ€“ sementara juga cukup ramah-manusia. Terutama, ini banyak digunakan di dunia pengembangan web, di mana Anda mungkin akan menemukan objek berseri-JSON yang dikirim dari API REST, konfigurasi aplikasi, atau bahkan penyimpanan data sederhana.

Mengingat prevalensinya, membaca dan mem-parsing file JSON (atau string) cukup umum, dan menulis JSON untuk dikirim juga sama lazimnya. Dalam panduan ini โ€“ kita akan melihat cara memanfaatkan json modul untuk membaca dan menulis JSON dengan Python.

Menulis JSON ke File dengan Python dengan json.dump() dan json.dumps()

Untuk menulis konten JSON ke file dengan Python โ€“ kita bisa menggunakan json.dump() dan json.dumps(). Ini adalah metode terpisah dan mencapai hasil yang berbeda:

  • json.dumps() โ€“ Membuat serial objek menjadi format JSON tali
  • json.dump() โ€“ Serialisasi objek ke dalam aliran JSON untuk disimpan ke dalam file atau soket

Catatan: Huruf "s" dalam "dumps" sebenarnya adalah kependekan dari โ€œtali pembuanganโ€.

Format alami JSON mirip dengan a peta dalam ilmu komputer โ€“ peta dari key-value berpasangan. Dengan Python, a kamus adalah implementasi peta, jadi kami secara alami dapat merepresentasikan JSON dengan tepat melalui a dict. Kamus dapat berisi kamus bersarang lainnya, array, boolean, atau tipe primitif lainnya seperti bilangan bulat dan string.

:::

Catatan: Built-in json package menawarkan beberapa metode kemudahan yang memungkinkan kita mengonversi antara JSON dan kamus.

:::

Karena itu, mari impor json modul, tentukan kamus dengan beberapa data dan kemudian ubah menjadi JSON sebelum disimpan ke file:

import json

data = {
    'employees' : [
        {
            'name' : 'John Doe',
            'department' : 'Marketing',
            'place' : 'Remote'
        },
        {
            'name' : 'Jane Doe',
            'department' : 'Software Engineering',
            'place' : 'Remote'
        },
        {
            'name' : 'Don Joe',
            'department' : 'Software Engineering',
            'place' : 'Office'
        }
    ]
}


json_string = json.dumps(data)
print(json_string)

Ini menghasilkan:

{'employees': [{'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'}]}

Di sini, kami memiliki kamus sederhana dengan beberapa employees, yang masing-masing memiliki a name, department dan place. itu dumps() fungsi dari json modul kesedihan kamus ke dalam konten JSON, dan mengembalikan a string JSON.

Setelah diserialisasi, Anda dapat memutuskan untuk mengirimkannya ke layanan lain yang akan membatalkan serialisasinya, atau, katakanlah, menyimpannya. Untuk menyimpan string JSON ini ke dalam file, kita cukup membuka file dalam mode tulis, dan menuliskannya. Jika Anda tidak ingin mengekstrak data menjadi variabel independen untuk digunakan nanti dan hanya ingin membuangnya ke dalam file, Anda dapat melewati dumps() fungsi dan kegunaan dump() sebagai gantinya:


with open('json_data.json', 'w') as outfile:
    outfile.write(json_string)


with open('json_data.json', 'w') as outfile:
    json.dump(json_string, outfile)

Objek seperti file apa pun dapat diteruskan ke argumen kedua dari dump() fungsi, bahkan jika itu bukan file yang sebenarnya. Contoh yang baik dari ini adalah soket, yang dapat dibuka, ditutup, dan ditulis seperti file.

Membaca JSON dari File dengan Python dengan json.load() dan json.loads()

Pemetaan antara konten kamus dan string JSON sangatlah mudah, sehingga mudah untuk mengonversi keduanya. Logika yang sama dengan dump() dan dumps() diterapkan ke load() dan loads(). Seperti json.dumps(), yang json.loads() fungsi menerima string JSON dan mengubahnya menjadi kamus, sementara json.load() memungkinkan Anda memuat dalam file:

import json

with open('json_data.json') as json_file:
    data = json.load(json_file)
    print(data)

Ini menghasilkan:

{'employees': [{'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'}]}

Alternatifnya, mari kita baca string JSON ke dalam kamus:

import json

python_dictionary = json.loads(json_string)
print(python_dictionary)

Yang juga menghasilkan:

{'employees': [{'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'}]}

Yang ini sangat berguna untuk mem-parsing respons REST API yang mengirim JSON. Data ini datang kepada Anda sebagai string, yang kemudian dapat Anda teruskan json.loads() secara langsung, dan Anda memiliki kamus yang jauh lebih mudah dikelola untuk dikerjakan!

Sorting, Pretty-Printing, Separator dan Encoding

Saat membuat serial data Anda ke JSON dengan Python, format standar yang bertujuan meminimalkan memori yang diperlukan untuk mengirimkan pesan tidak terlalu mudah dibaca karena spasi putih dihilangkan. Meskipun ini adalah perilaku ideal untuk transfer data (komputer tidak peduli dengan keterbacaan, tetapi peduli dengan ukuran) โ€“ terkadang Anda mungkin perlu membuat perubahan kecil, seperti menambahkan spasi agar dapat dibaca oleh manusia.

Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!

Catatan: json.dump()/json.dumps() dan json.load()/json.loads() semua menyediakan beberapa pilihan pemformatan.

JSON Mencetak Cantik dengan Python

Membuat JSON dapat dibaca manusia (alias โ€œprinting cantikโ€) semudah meneruskan nilai bilangan bulat untuk indent parameter:

import json
data = {'people':[{'name': 'Scott', 'website': 'stackabuse.com', 'from': 'Nebraska'}]}
print(json.dumps(data, indent=4))

Ini melipat lekukan 4-ruang pada setiap blok logis baru:

{
    "people": [
        {
            "website": "stackabuse.com", 
            "from": "Nebraska", 
            "name": "Scott"
        }
    ]
}

Pilihan lain adalah menggunakan alat baris perintah โ€“ json.tool. Dengannya, Anda dapat mencetak JSON dengan cantik di baris perintah tanpa memengaruhi string yang dikirimkan, dan hanya memengaruhi tampilannya di pipa keluaran standar:

$ echo '{"people":[{"name":"Scott", "website":"stackabuse.com", "from":"Nebraska"}]}' | python -m json.tool
{
    "people": [
        {
            "name": "Scott",
            "website": "stackabuse.com"
            "from": "Nebraska",
        }
    ]
}

Menyortir Objek JSON dengan Kunci

Dalam istilah JSON:

โ€œSebuah objek adalah sekumpulan pasangan nama/nilai yang tidak terurut.โ€

Urutan kunci tidak dijamin, tetapi Anda mungkin perlu memberlakukan urutan kunci. Untuk mencapai pemesanan, Anda dapat lulus True ke sort_keys pilihan saat menggunakan json.dump() or json.dumps():

import json
data = {'people':[{'name': 'Scott', 'website': 'stackabuse.com', 'from': 'Nebraska'}]}
print(json.dumps(data, sort_keys=True, indent=4))

Ini menghasilkan:

{
    "people": [
        {
            "from": "Nebraska",
            "name": "Scott",
            "website": "stackabuse.com"
        }
    ]
}

Teks ASCII dan Pengodean

Secara default, json.dump() dan json.dumps() akan memastikan bahwa teks dalam kamus Python yang diberikan dikodekan ASCII. Jika ada karakter non-ASCII, maka karakter tersebut akan di-escape secara otomatis, seperti yang ditampilkan dalam contoh berikut:

import json
data = {'item': 'Beer', 'cost':'ยฃ4.00'}
jstr = json.dumps(data, indent=4)
print(jstr)
{
    "item": "Beer",
    "cost": "u00a34.00"
}

Ini tidak selalu dapat diterima, dan dalam banyak kasus Anda mungkin ingin mempertahankan karakter Unicode Anda tidak berubah. Untuk melakukan ini, atur ensure_ascii pilihan untuk False:

jstr = json.dumps(data, ensure_ascii=False, indent=4)
print(jstr)
{
    "item": "Beer",
    "cost": "ยฃ4.00"
}

Lewati Jenis Data Kunci Khusus

Jika kunci dalam kamus Anda adalah tipe non-primitif (str, int, float, bool or None) Dari TypeError dimunculkan saat Anda mencoba membuang konten JSON ke dalam file. Anda dapat melewati kunci ini melalui skipkeys argumen:

jstr = json.dumps(data, skipkeys=True)

Mengaktifkan dan Menonaktifkan Pemeriksaan Edaran

Jika properti objek JSON mereferensikan dirinya sendiri, atau objek lain yang mereferensikan kembali objek induk โ€“ JSON rekursif tak terhingga akan dibuat. Rekursi tak terbatas biasanya mengakibatkan memori dialokasikan dengan cepat hingga perangkat kehabisan memori, dan dalam kasus dumping JSON, RecursionError dinaikkan dan pembuangan dihentikan.

Hal ini diatur oleh check_circular bendera, yaitu True secara default, dan mencegah kemungkinan masalah saat menulis dependensi melingkar. Untuk mematikannya, Anda dapat mengaturnya ke `False:

jstr = json.dumps(data, check_circular=False)

Perhatikan, bagaimanapun, bahwa ini adalah sangat tidak direkomendasikan.

Mengaktifkan dan Menonaktifkan NaN

Nilai-NaN, seperti -inf, inf dan nan dapat menyusup ke objek yang ingin Anda buat serial atau deserial. standar JSON tidak mengizinkan untuk nilai NaN, tetapi masih membawa nilai logis yang mungkin ingin Anda kirimkan dalam pesan. Di sisi lain โ€“ Anda mungkin ingin menerapkan nilai NaN tersebut tidak ditransmisikan, dan munculkan pengecualian sebagai gantinya. Itu allow_nan bendera diatur ke True secara default, dan memungkinkan Anda untuk membuat serialisasi dan deserialize nilai NaN, menggantinya dengan setara JavaScript (Inifinity, -Infinity dan NaN).

Jika Anda mengatur bendera ke False sebagai gantinya โ€“ Anda akan beralih ke format standar JSON yang ketat, yang menimbulkan a ValueError jika objek Anda berisi atribut dengan nilai-nilai ini:

jstr = json.dumps(data, allow_nan=False)

Mengubah Separator

Di JSON, kunci dipisahkan dari nilai dengan titik dua (:) dan item dipisahkan satu sama lain dengan koma (,):

key1:value1,
key2:value2

Pemisah default untuk membaca dan menulis JSON dengan Python adalah (', ', ': ') dengan ruang putih setelah koma dan titik dua. Anda dapat mengubah ini untuk melewatkan spasi putih dan dengan demikian membuat JSON sedikit lebih padat, atau sepenuhnya mengubah pemisah dengan karakter khusus lainnya untuk representasi yang berbeda:


jstr = json.dumps(data, separators=(',', ':'))

Masalah Kompatibilitas dengan Python 2

Jika Anda menggunakan Python versi lama (2.x) โ€“ Anda mungkin mengalami a TypeError saat mencoba membuang konten JSON ke dalam file. Yakni, jika isinya mengandung karakter non-ASCII, a TypeError dinaikkan, meskipun Anda melewati argumen penyandian, saat menggunakan json.dump() Metode:


with open('json_data.json', 'w', encoding='utf-8') as outfile:
    json.dump(json_string, outfile, ensure_ascii=False)

Jika Anda menemukan kasus tepi ini, yang telah diperbaiki di versi Python berikutnya โ€“ coba gunakan json.dumps() sebagai gantinya, dan tulis konten string ke dalam file alih-alih mengalirkan konten langsung ke file.

Kesimpulan

Dalam panduan ini, kami memperkenalkan Anda ke json.dump(), json.dumps(), json.load(), dan json.loads() metode, yang membantu dalam serialisasi dan deserialisasi string JSON.

Kami kemudian melihat bagaimana Anda dapat mengurutkan objek JSON, mencetaknya dengan cantik, mengubah penyandian, melewati tipe data kunci khusus, mengaktifkan atau menonaktifkan pemeriksaan melingkar dan apakah NaN diizinkan, serta cara mengubah pemisah untuk serialisasi dan deserialisasi.

Dengan JSON yang menjadi salah satu cara paling populer untuk membuat serialisasi data terstruktur, Anda mungkin harus sering berinteraksi dengannya, terutama saat mengerjakan aplikasi web. Python json modul adalah cara yang bagus untuk memulai, meskipun Anda mungkin akan menemukannya simplejson adalah alternatif bagus lainnya yang tidak terlalu ketat pada sintaks JSON.

Stempel Waktu:

Lebih dari penyalahgunaan