pythonjsonapiMenengah5 mnt baca

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

python
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:

python
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 s berarti string, tidak ada s berarti file. ensure_ascii=False menjaga 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:

python
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

python
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

python
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 38000

Kesalahan umum

SALAH: tertukar dump dan dumps

python
json.dump(data, "hasil.json")  # TypeError: argumen kedua harus file, bukan string!

BENAR: dump untuk file (pakai open), dumps untuk string

python
with open("hasil.json", "w") as f:
    json.dump(data, f)
teks = json.dumps(data)

SALAH: JSON tidak kenal semua tipe Python

python
from datetime import date
json.dumps({"hari": date.today()})  # TypeError: Object of type date is not JSON serializable

BENAR: ubah dulu jadi string

python
json.dumps({"hari": date.today().isoformat()})  # {"hari": "2026-10-08"}

SALAH: mengira key JSON selalu string saat dibaca

python
data = json.loads('{"1": "satu"}')
print(data[1])  # KeyError! kuncinya string "1", bukan angka 1

BENAR: akses dengan tipe yang sesuai

python
print(data["1"])  # satu

Tantangan

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()?