Menu

JSON di Python: membaca, menulis, dan mengurai JSON dengan modul json

Cara membaca dan menulis JSON di Python: loads, dumps, membaca dari file, pretty print, dan menangani kasus khusus yang muncul pada data sungguhan.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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.

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 dengan ensure_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.

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:

PythonJSON
dictobjek
list, tuplearray
strstring
int, floatangka
Truetrue
Falsefalse
Nonenull

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=2 untuk file yang dibaca manusia, seperti konfigurasi, fixture, dan data ekspor. Lewati untuk lalu lintas jaringan yang mementingkan ukuran ringkas.
  • Atur ensure_ascii=False untuk output UTF-8 agar nama dengan aksen atau karakter non-Latin tetap terbaca.
  • Validasi dengan try/except json.JSONDecodeError saat 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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai