JSON di Python
Baca dan tulis JSON dengan json.load/loads/dump/dumps, taklukkan struktur nested, dan siapkan diri sebelum menyentuh API.
Analogi singkat: amplop standar
Bayangkan setiap aplikasi memakai bentuk amplopnya sendiri, persegi atau segitiga, sampai tukang pos pusing. Lalu semua sepakat memakai satu amplop standar. Itulah JSON: format teks standar untuk bertukar data antar program dalam bahasa apa pun, dan modul json Python adalah "tukang buka-tutup amplop" resminya.
Kenapa konsep ini ada?
Program jarang hidup sendiri: aplikasi Python-mu membaca konfigurasi, menyimpan hasil, atau mengambil data dari layanan lain (API). JSON menjadi bahasa perantara karena bisa dibaca manusia sekaligus gampang diurai mesin, dan objek serta array-nya mirip dict dan list Python sehingga konversinya nyaris 1 banding 1.
Empat fungsi inti: s untuk string
import json
# loads: STRING json -> objek Python (s = string)
teks = '{"nama": "Rina", "umur": 25, "hobi": ["baca", "ngoding"]}'
data = json.loads(teks)
print(data["nama"]) # Rina
print(type(data)) # <class 'dict'>
# dumps: objek Python -> STRING json
kembali = json.dumps(data)
print(kembali) # {"nama": "Rina", "umur": 25, "hobi": ["baca", "ngoding"]}
# versi cantik dengan indentasi
print(json.dumps(data, indent=2, ensure_ascii=False))Tanpa huruf s, fungsinya bekerja dengan file:
import json
# load: FILE -> objek Python
with open("config.json", encoding="utf-8") as f:
config = json.load(f)
# dump: objek Python -> FILE
hasil = {"total": 23000, "tanggal": "2026-10-08"}
with open("hasil.json", "w", encoding="utf-8") as f:
json.dump(hasil, f, indent=2, ensure_ascii=False)Catatan teknis: Ada
sberarti string, tidak adasberarti file.ensure_ascii=Falsemenjaga karakter non-ASCII tetap terbaca, bukan jadi kode \u.
Struktur nested: menyelam dengan aman
Data JSON dari API biasanya bersarang dalam. Kombinasikan dengan teknik get dari modul dict:
import json
respon = '''
{
"status": "ok",
"data": {
"pengguna": {
"nama": "Dedi",
"kota": "Bandung"
},
"pesanan": [
{"barang": "kopi", "qty": 2},
{"barang": "roti", "qty": 1}
]
}
}
'''
obj = json.loads(respon)
# akses bertingkat yang aman
nama = obj.get("data", {}).get("pengguna", {}).get("nama", "?")
print(nama) # Dedi
# loop array di dalamnya
for p in obj["data"]["pesanan"]:
print(p["barang"], "x", p["qty"])Contoh 1: baca, ubah, tulis kembali
import json
# 1. baca file JSON
with open("produk.json", encoding="utf-8") as f:
produk = json.load(f) # list of dict
# 2. ubah: naikkan harga 10%
for p in produk:
p["harga"] = int(p["harga"] * 1.1)
# 3. tulis kembali dengan rapi
with open("produk_baru.json", "w", encoding="utf-8") as f:
json.dump(produk, f, indent=2, ensure_ascii=False)
print("Selesai,", len(produk), "produk diperbarui")Pola baca-ubah-tulis ini adalah 80% pekerjaan JSON sehari-hari.
Contoh 2: siapkan payload sebelum kirim ke API
import json
# bangun struktur data Python biasa...
payload = {
"nama_toko": "Warkop Doa Ambu",
"transaksi": [
{"barang": "kopi", "qty": 2, "harga": 15000},
{"barang": "teh", "qty": 1, "harga": 8000},
],
}
# ...lalu ubah jadi string JSON siap kirim
body = json.dumps(payload, ensure_ascii=False)
print(body)
# {"nama_toko": "Warkop Doa Ambu", "transaksi": [{"barang": "kopi", ...}]}
# di sisi penerima, string itu diurai kembali
diterima = json.loads(body)
total = sum(t["qty"] * t["harga"] for t in diterima["transaksi"])
print("Total: Rp", total) # Total: Rp 38000Kesalahan umum
SALAH: tertukar dump dan dumps
json.dump(data, "hasil.json") # TypeError: argumen kedua harus file, bukan string!BENAR: dump untuk file (pakai open), dumps untuk string
with open("hasil.json", "w") as f:
json.dump(data, f)
teks = json.dumps(data)SALAH: JSON tidak kenal semua tipe Python
from datetime import date
json.dumps({"hari": date.today()}) # TypeError: Object of type date is not JSON serializableBENAR: ubah dulu jadi string
json.dumps({"hari": date.today().isoformat()}) # {"hari": "2026-10-08"}SALAH: mengira key JSON selalu string saat dibaca
data = json.loads('{"1": "satu"}')
print(data[1]) # KeyError! kuncinya string "1", bukan angka 1BENAR: akses dengan tipe yang sesuai
print(data["1"]) # satuTantangan
Ubah Harga di JSON
Diberi string JSON berisi list produk (nama dan harga). Parsing dengan loads, naikkan semua harga 10%, lalu ubah kembali jadi string JSON rapi dengan dumps dan indent=2.
Kuis Bab
Uji pemahamanmu: Bab 3: Struktur Data dan Utilitas
Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".
1.Apa perbedaan utama list dan tuple?
2.Kenapa memakai data.get('umur', 0) lebih aman daripada data['umur']?
3.Apa hasil dari set([1, 2, 2, 3, 3, 3])?
4.Untuk apa datetime.strptime('2026-10-08', '%Y-%m-%d') dipakai?
5.Apa fungsi json.loads()?