JSON dan Python memakai bentuk yang sama
JSON adalah format default untuk API, file konfigurasi, dan pertukaran data di web. Untungnya bagi programmer Python, objek JSON langsung dipetakan ke dict Python, array JSON ke list, dan string JSON ke str. Kecocokan yang erat itulah yang membuat membaca dan menulis JSON di Python cukup dengan dua baris.
Modul json di standard library menangani kedua arah itu.
Mengurai string JSON
json.loads(text) ("load string") menerima string berformat JSON lalu mengembalikan objek Python yang diwakilinya:
Hasilnya adalah dict biasa. Kamu mengakses key-nya seperti dict lainnya: tidak ada pembungkus JSON khusus, tidak ada method .parse() pada hasilnya.
Kalau string itu bukan JSON yang valid, json.loads memunculkan json.JSONDecodeError. Pesan error-nya menyertakan baris dan kolom tempat masalahnya, yang biasanya cukup untuk menemukan koma yang hilang atau tanda kutip yang tidak di-escape.
Menulis JSON sebagai string
json.dumps(data) ("dump string") melakukan kebalikannya: menerima objek Python lalu mengembalikan string JSON:
True, False, dan None milik Python otomatis diterjemahkan menjadi true, false, dan null di JSON. Angka dan string tidak berubah. List menjadi array, dict menjadi objek.
Pretty print
Output default json.dumps sangat ringkas: cocok untuk dikirim lewat jaringan, tapi sulit dibaca manusia. Berikan indent=2 agar lebih mudah dibaca:
Beberapa opsi dumps lain yang perlu kamu tahu:
sort_keys=True: mengurutkan key objek berdasarkan abjad. Berguna untuk output yang selalu sama (file konfigurasi, test fixture, diff).ensure_ascii=False: menulis karakter non-ASCII (é, ü, 中) apa adanya, bukan sebagai escape\u. Biasanya pilihan yang tepat untuk file UTF-8.separators=(",", ":"): output paling rapat. Digabung denganensure_ascii=False, menghasilkan JSON UTF-8 paling ringkas yang bisa kamu buat.
Membaca JSON dari file
json.load(file) (tanpa s) membaca langsung dari objek file. Pola yang umum memasangkannya dengan with open:
import json
with open("config.json") as f:
config = json.load(f)
print(config["version"])
Tidak perlu membaca seluruh file ke dalam string dulu; json.load membaca langsung dari objek file.
Menulis JSON ke file
json.dump(data, file) adalah pasangannya untuk menulis file:
import json
data = {"created": "2026-01-01", "items": [1, 2, 3]}
with open("state.json", "w") as f:
json.dump(data, f, indent=2)
Opsi indent juga bisa dipakai di sini. Buka file hasilnya, dan kamu akan melihat dokumen JSON yang terformat rapi.
Membaca response API berformat JSON
Kebanyakan library HTTP memberimu byte atau teks; kamu memanggil json.loads untuk mengubahnya menjadi data yang bisa dipakai:
import json
import urllib.request
with urllib.request.urlopen("https://api.example.com/users/1") as response:
text = response.read().decode("utf-8")
user = json.loads(text)
print(user["name"])
Library requests (dibahas terpisah) melewati satu langkah: response-nya punya method .json() yang memanggil json.loads untukmu.
Apa yang bisa dan tidak bisa diwakili JSON
Sistem tipe JSON lebih sempit daripada Python. Pemetaannya di kedua arah:
| Python | JSON |
|---|---|
dict | objek |
list, tuple | array |
str | string |
int, float | angka |
True | true |
False | false |
None | null |
Tuple yang diubah bolak-balik akan kembali sebagai list: sifat tuple-nya hilang. Set, class buatan sendiri, dan objek datetime tidak bisa diserialisasi secara default; kamu akan mendapat TypeError: Object of type X is not JSON serializable.
Menangani datetime dan objek khusus
Ada dua pendekatan yang umum.
Ubah dulu ke struktur yang aman untuk JSON. Lakukan transformasinya di kodemu sendiri, lalu serialisasi dict biasa:
Berikan fungsi default=. json.dumps memanggilnya untuk setiap nilai yang tidak tahu cara diserialisasi:
Saat membaca datanya kembali, kamu harus mengubah string ISO itu menjadi datetime sendiri, karena JSON tidak mengingat tipe aslinya.
Mengubah dict bolak-balik lewat JSON
Pengecekan singkat bahwa dict tetap utuh:
Nilainya sama, tapi objeknya berbeda. Sering kali itulah yang kamu inginkan: json.dumps + json.loads adalah cara murah untuk membuat deep copy dari struktur apa pun yang kompatibel dengan JSON.
Contoh yang realistis
Skrip kecil yang memuat konfigurasi JSON, mengubah satu field, lalu menyimpannya kembali:
import json
from pathlib import Path
config_path = Path("settings.json")
# Load (with a default if the file doesn't exist).
if config_path.exists():
config = json.loads(config_path.read_text())
else:
config = {"theme": "dark", "last_opened": None}
# Update.
config["last_opened"] = "2026-01-15"
# Save, pretty-printed.
config_path.write_text(json.dumps(config, indent=2, ensure_ascii=False))
Itulah siklus JSON "baca, ubah, tulis" yang lengkap dalam selusin baris.
Beberapa kebiasaan baik
- Pakai
with open(...)untuk file, selalu. JSON hanyalah teks; semua aturan penanganan file berlaku. - Utamakan
indent=2untuk file yang dibaca manusia, seperti konfigurasi, fixture, dan data ekspor. Lewati untuk lalu lintas jaringan yang mementingkan ukuran ringkas. - Atur
ensure_ascii=Falseuntuk output UTF-8 agar nama dengan aksen atau karakter non-Latin tetap terbaca. - Validasi dengan
try/except json.JSONDecodeErrorsaat mengurai data yang tidak kamu buat sendiri.
Berikutnya
JSON menangani data key-value. Alat berikutnya di bab yang sama adalah CSV, dukungan bawaan Python untuk format tabel di balik sebagian besar ekspor spreadsheet yang akan kamu temui.
Pertanyaan yang sering diajukan
Bagaimana cara mengurai JSON di Python?
Pakai json.loads(text) untuk string JSON atau json.load(file) untuk objek file. Keduanya mengembalikan dict Python (atau list, tergantung JSON-nya). Contoh: data = json.loads('{"name": "Rosa"}'), lalu data['name'] bernilai 'Rosa'.
Bagaimana cara mengubah dictionary Python menjadi JSON?
json.dumps(my_dict) mengembalikan string JSON. json.dump(my_dict, file) langsung menulis ke objek file. Berikan indent=2 untuk output yang rapi: json.dumps(data, indent=2).
Apa bedanya json.loads dan json.load?
loads (dengan s) menerima string. load (tanpa s) menerima objek file. Begitu juga dumps vs dump. Huruf s berarti string; itulah cara termudah untuk mengingat mana yang mana.
Bagaimana cara menangani tanggal dan objek khusus di JSON?
JSON tidak punya tipe tanggal, jadi kirim tanggal sebagai string ISO-8601 lalu urai kembali secara manual. Untuk class buatan sendiri, berikan fungsi default= ke json.dumps yang mengembalikan representasi yang aman untuk JSON, atau ubah sendiri menjadi dict sebelum diserialisasi.