Konversi CSV ke JSON di Python โ Panduan json.dumps()
Gunakan CSV to JSON gratis langsung di browser Anda โ tidak perlu instalasi.
Coba CSV to JSON Online โFile CSV ada di mana-mana โ laporan yang diekspor, dump database, ekstrak log โ dan cepat atau lambat Anda perlu mengonversi CSV tersebut ke JSON di Python. Standard library menangani ini dengan dua modul: csv.DictReader mengubah setiap baris menjadi dict Python, dan json.dumps() melakukan serialisasi dict tersebut ke string JSON. Untuk konversi cepat tanpa kode, konverter CSV ke JSON melakukannya secara instan di browser. Panduan ini mencakup jalur pemrograman lengkap: json.dump() vs json.dumps(), menulis JSON ke file, serialisasi dataclass, konversi tipe untuk nilai CSV, penanganan datetime dan Decimal, serta alternatif berkinerja tinggi seperti orjson. Semua contoh menargetkan Python 3.10+.
- โcsv.DictReader menghasilkan list of dicts โ serialisasi seluruh list dengan json.dump(rows, f, indent=2) untuk menulis file JSON.
- โjson.dump() menulis langsung ke objek file. json.dumps() mengembalikan string. Pilih yang tepat dan Anda menghindari salinan yang tidak perlu.
- โNilai CSV selalu berupa string. Cast kolom numerik secara eksplisit (int(), float()) sebelum serialisasi ke JSON.
- โBerikan ensure_ascii=False ke json.dumps() untuk mempertahankan karakter Unicode โ nama beraksent, teks CJK โ pada keluaran.
- โUntuk datetime, UUID, atau Decimal dari CSV, gunakan parameter default= dengan fungsi fallback kustom.
order_id,product,quantity,price ORD-7291,Wireless Keyboard,2,49.99 ORD-7292,USB-C Hub,1,34.50
[
{
"order_id": "ORD-7291",
"product": "Wireless Keyboard",
"quantity": "2",
"price": "49.99"
},
{
"order_id": "ORD-7292",
"product": "USB-C Hub",
"quantity": "1",
"price": "34.50"
}
]"2", "49.99") pada keluaran mentah. CSV tidak memiliki sistem tipe โ setiap nilai adalah string. Cara memperbaikinya dibahas di bagian konversi tipe di bawah.json.dumps() โ Serialisasi Dict Python ke String JSON
Modul json sudah disertakan dengan setiap instalasi Python โ tidak perlu pip install. json.dumps(obj) menerima objek Python (dict, list, string, angka, bool, atau None) dan mengembalikan str yang berisi JSON valid. Dictionary Python terlihat mirip dengan objek JSON, tetapi keduanya pada dasarnya berbeda: dict adalah struktur data Python di memori, sedangkan string JSON adalah teks yang telah diserialisasi. Memanggil json.dumps() menjembatani perbedaan tersebut.
Contoh Minimal โ Satu Baris CSV ke JSON
import json
# Satu baris CSV yang direpresentasikan sebagai dict Python
server_entry = {
"hostname": "web-prod-03",
"ip_address": "10.0.12.47",
"port": 8080,
"region": "eu-west-1"
}
# Konversi dict ke string JSON
json_string = json.dumps(server_entry)
print(json_string)
# {"hostname": "web-prod-03", "ip_address": "10.0.12.47", "port": 8080, "region": "eu-west-1"}
print(type(json_string))
# <class 'str'>Hasilnya adalah JSON kompak satu baris โ bagus untuk payload dan penyimpanan, tetapi sulit dibaca. Tambahkan indent=2 untuk keluaran yang mudah dibaca manusia:
import json
server_entry = {
"hostname": "web-prod-03",
"ip_address": "10.0.12.47",
"port": 8080,
"region": "eu-west-1"
}
pretty_json = json.dumps(server_entry, indent=2)
print(pretty_json)
# {
# "hostname": "web-prod-03",
# "ip_address": "10.0.12.47",
# "port": 8080,
# "region": "eu-west-1"
# }Dua parameter lagi yang hampir selalu saya gunakan: sort_keys=True mengurutkan kunci dictionary secara alfabetis (berguna untuk membandingkan file JSON antar versi), dan ensure_ascii=False mempertahankan karakter non-ASCII alih-alih meng-escape-nya ke urutan \uXXXX.
import json
warehouse_record = {
"sku": "WH-9031",
"location": "Gudang Jakarta 3",
"quantity": 240,
"last_audit": "2026-03-10"
}
output = json.dumps(warehouse_record, indent=2, sort_keys=True, ensure_ascii=False)
print(output)
# {
# "last_audit": "2026-03-10",
# "location": "Gudang Jakarta 3",
# "quantity": 240,
# "sku": "WH-9031"
# }Catatan singkat mengenai parameter separators: defaultnya adalah (", ", ": ") yang menambahkan spasi setelah koma dan titik dua. Untuk keluaran sepaling kompak (berguna saat menyematkan JSON dalam parameter URL atau menghemat byte dari respons API), berikan separators=(",", ":").
json.dumps() mengonversi Python True ke JSON true, None ke null, dan membungkus string dengan tanda kutip ganda (Python membolehkan kutip tunggal, JSON tidak). Selalu gunakan json.dumps() untuk menghasilkan JSON valid โ jangan mengandalkan str() atau repr().csv.DictReader ke File JSON โ Pipeline Lengkap
Tugas dunia nyata yang paling umum adalah membaca seluruh file CSV dan menyimpannya sebagai JSON. Berikut adalah skrip end-to-end dalam kurang dari 10 baris. csv.DictReader menghasilkan iterator objek dict โ satu per baris, menggunakan baris pertama sebagai kunci. Membungkusnya dengan list() mengumpulkan semua baris ke dalam list Python, yang diserialisasi menjadi array JSON.
import csv
import json
# Langkah 1: Baca baris CSV ke dalam list of dicts
with open("inventory.csv", "r", encoding="utf-8") as csv_file:
rows = list(csv.DictReader(csv_file))
# Langkah 2: Tulis list sebagai file JSON
with open("inventory.json", "w", encoding="utf-8") as json_file:
json.dump(rows, json_file, indent=2, ensure_ascii=False)
print(f"Mengonversi {len(rows)} baris ke inventory.json")Dua pemanggilan open(): satu untuk membaca CSV, satu untuk menulis JSON. Itulah keseluruhan polanya. Perhatikan ini menggunakan json.dump() (tanpa s) โ ia menulis langsung ke file handle. Menggunakan json.dumps() akan mengembalikan string yang kemudian perlu Anda tulis secara terpisah dengan f.write(). json.dump() lebih efisien dalam penggunaan memori karena melakukan streaming keluaran alih-alih membangun seluruh string di memori terlebih dahulu.
Saat Anda membutuhkan JSON sebagai string daripada file โ untuk disematkan dalam payload API, dicetak ke stdout, atau dimasukkan ke kolom database โ beralih ke json.dumps():
import csv
import json
with open("sensors.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
# Dapatkan JSON sebagai string alih-alih menulis ke file
json_payload = json.dumps(rows, indent=2)
print(json_payload)
# [
# {
# "sensor_id": "TMP-4401",
# "location": "Gedung 7 - Lantai 2",
# "reading": "22.4",
# "unit": "celsius"
# },
# ...
# ]Satu baris vs. seluruh dataset: jika Anda memanggil json.dumps(single_dict) Anda mendapatkan objek JSON ({...}). Panggil json.dumps(list_of_dicts) dan Anda mendapatkan array JSON ([{...}, {...}]). Bentuk container terluar bergantung pada apa yang Anda berikan. Sebagian besar konsumen hilir mengharapkan array untuk data tabular.
Menangani Nilai Non-String โ Konversi Tipe dari CSV
Inilah hal yang membuat semua orang tersandung pertama kali: csv.DictReader mengembalikan setiap nilai sebagai string. Angka 42 di CSV Anda menjadi string "42" di dalam dict. Jika Anda langsung melakukan serialisasi dengan json.dumps(), JSON Anda akan memiliki "quantity": "42" alih-alih "quantity": 42. API yang memvalidasi tipe akan menolak ini. Anda perlu melakukan cast nilai secara eksplisit.
import csv
import json
def coerce_types(row: dict) -> dict:
"""Konversi nilai string ke tipe Python yang sesuai."""
return {
"sensor_id": row["sensor_id"],
"location": row["location"],
"temperature": float(row["temperature"]),
"humidity": float(row["humidity"]),
"battery_pct": int(row["battery_pct"]),
"active": row["active"].lower() == "true",
}
with open("sensor_readings.csv", "r", encoding="utf-8") as f:
rows = [coerce_types(row) for row in csv.DictReader(f)]
print(json.dumps(rows[0], indent=2))
# {
# "sensor_id": "TMP-4401",
# "location": "Gedung 7 - Lantai 2",
# "temperature": 22.4,
# "humidity": 58.3,
# "battery_pct": 87,
# "active": true
# }Sekarang temperature adalah float, battery_pct adalah integer, dan active adalah boolean pada keluaran JSON. Fungsi konversi tipe spesifik untuk skema CSV Anda โ tidak ada cara generik untuk menebak tipe dari data CSV, jadi saya menulis satu fungsi per format CSV.
Serialisasi Objek Kustom dan Tipe Non-Standar
Modul json Python tidak dapat melakukan serialisasi datetime, UUID, Decimal, atau kelas kustom secara langsung. Memanggil json.dumps() pada salah satu dari ini akan raise TypeError. Ada dua pendekatan untuk menanganinya.
Pendekatan 1: Parameter default=
Berikan fungsi ke default= yang mengonversi tipe yang tidak dikenal ke sesuatu yang dapat diserialisasi. Fungsi ini dipanggil hanya untuk objek yang tidak diketahui cara penanganannya oleh encoder JSON.
import json
from datetime import datetime
from decimal import Decimal
from uuid import UUID
def json_serial(obj):
"""Serializer fallback untuk tipe non-standar."""
if isinstance(obj, datetime):
return obj.isoformat()
if isinstance(obj, UUID):
return str(obj)
if isinstance(obj, Decimal):
return float(obj)
raise TypeError(f"Type {type(obj).__name__} is not JSON serializable")
transaction = {
"txn_id": UUID("a1b2c3d4-e5f6-7890-abcd-ef1234567890"),
"amount": Decimal("149.99"),
"currency": "EUR",
"processed_at": datetime(2026, 3, 15, 14, 30, 0),
"gateway": "stripe",
}
print(json.dumps(transaction, indent=2, default=json_serial))
# {
# "txn_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
# "amount": 149.99,
# "currency": "EUR",
# "processed_at": "2026-03-15T14:30:00",
# "gateway": "stripe"
# }TypeError di akhir fungsi default= Anda untuk tipe yang tidak dikenal. Jika Anda mengembalikan None atau melewatinya secara diam-diam, Anda mendapatkan null pada keluaran tanpa indikasi bahwa data telah hilang.Pendekatan 2: Dataclass dengan asdict()
Dataclass Python memberikan definisi tipe yang tepat untuk baris CSV Anda. Gunakan dataclasses.asdict() untuk mengonversi instance dataclass menjadi dict biasa, lalu berikan ke json.dumps().
import json
from dataclasses import dataclass, asdict
from datetime import datetime
@dataclass
class ShipmentRecord:
tracking_id: str
origin: str
destination: str
weight_kg: float
shipped_at: datetime
def json_serial(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Not serializable: {type(obj).__name__}")
shipment = ShipmentRecord(
tracking_id="SHP-9827",
origin="Surabaya",
destination="Jakarta",
weight_kg=1240.5,
shipped_at=datetime(2026, 3, 12, 8, 0, 0),
)
print(json.dumps(asdict(shipment), indent=2, default=json_serial))
# {
# "tracking_id": "SHP-9827",
# "origin": "Surabaya",
# "destination": "Jakarta",
# "weight_kg": 1240.5,
# "shipped_at": "2026-03-12T08:00:00"
# }asdict() secara rekursif mengonversi dataclass bersarang menjadi dict. Jika dataclass Anda berisi list dataclass lain, seluruh pohon akan dikonversi โ tidak diperlukan kode tambahan.Referensi Parameter json.dumps()
Daftar lengkap argumen kata kunci yang diterima oleh json.dumps() dan json.dump(). Kedua fungsi menerima parameter yang identik โ json.dump() menerima argumen pertama tambahan untuk objek file.
csv.DictReader โ Membaca CSV ke dalam Dict Python
csv.DictReader adalah separuh lainnya dari pipeline CSV-ke-JSON. Ia membungkus objek file dan menghasilkan satu dict per baris, menggunakan baris pertama sebagai nama field. Dibandingkan dengan csv.reader (yang menghasilkan list biasa), DictReader memberi Anda akses bernama ke kolom โ tidak ada indeks seperti row[3].
import csv
import json
# File tab-separated dari ekspor database
with open("user_sessions.tsv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f, delimiter="\t")
sessions = list(reader)
print(json.dumps(sessions[:2], indent=2))
# [
# {
# "session_id": "sess_8f2a91bc",
# "user_id": "usr_4421",
# "started_at": "2026-03-15T09:12:00Z",
# "duration_sec": "342",
# "pages_viewed": "7"
# },
# {
# "session_id": "sess_3c7d44ef",
# "user_id": "usr_1187",
# "started_at": "2026-03-15T09:14:22Z",
# "duration_sec": "128",
# "pages_viewed": "3"
# }
# ]csv.DictReader membaca seluruh file secara lazy โ ia menghasilkan baris satu per satu. Memanggil list(reader) memuat semua baris ke memori. Untuk file dengan jutaan baris, proses baris secara streaming alih-alih mengumpulkan semuanya.Konversi CSV dari File dan Respons API
Dua skenario produksi: membaca file CSV dari disk dan mengonversinya, serta mengambil data CSV dari endpoint API (banyak layanan pelaporan mengembalikan CSV). Keduanya memerlukan penanganan error yang tepat.
Baca File CSV โ Konversi โ Tulis JSON
import csv
import json
import sys
def csv_to_json_file(csv_path: str, json_path: str) -> int:
"""Konversi file CSV ke JSON. Mengembalikan jumlah baris yang ditulis."""
try:
with open(csv_path, "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
except FileNotFoundError:
print(f"Error: {csv_path} not found", file=sys.stderr)
sys.exit(1)
except csv.Error as e:
print(f"CSV parse error in {csv_path}: {e}", file=sys.stderr)
sys.exit(1)
with open(json_path, "w", encoding="utf-8") as f:
json.dump(rows, f, indent=2, ensure_ascii=False)
return len(rows)
count = csv_to_json_file("fleet_vehicles.csv", "fleet_vehicles.json")
print(f"Menulis {count} rekaman ke fleet_vehicles.json")Ambil CSV dari API โ Parsing โ JSON
import csv
import io
import json
import urllib.request
def fetch_csv_as_json(url: str) -> str:
"""Ambil CSV dari URL dan kembalikan sebagai string JSON."""
try:
with urllib.request.urlopen(url, timeout=10) as resp:
raw = resp.read().decode("utf-8")
except urllib.error.URLError as e:
raise RuntimeError(f"Failed to fetch {url}: {e}")
reader = csv.DictReader(io.StringIO(raw))
rows = list(reader)
if not rows:
raise ValueError("CSV response was empty or had no data rows")
return json.dumps(rows, indent=2, ensure_ascii=False)
# Contoh: endpoint ekspor yang mengembalikan CSV
try:
result = fetch_csv_as_json("https://reports.internal/api/v2/daily-metrics.csv")
print(result)
except (RuntimeError, ValueError) as e:
print(f"Error: {e}")Kedua contoh menggunakan encoding="utf-8" secara eksplisit pada setiap pembukaan file. Ini penting untuk file CSV dengan karakter non-ASCII โ nama beraksent, alamat dengan karakter khusus, teks CJK. Tanpa encoding eksplisit, Python menggunakan default sistem, yang di Windows sering kali cp1252 dan akan merusak karakter multibyte secara diam-diam.
Memverifikasi Keluaran JSON dengan json.loads()
Setelah mengonversi CSV ke string JSON, Anda dapat memverifikasi hasilnya dengan mem-parsing kembali menggunakan json.loads(). Round-trip ini mendeteksi masalah encoding, urutan escape yang rusak, atau penggabungan string yang tidak disengaja yang akan menghasilkan JSON tidak valid. Bungkus pemanggilan dalam blok try/except.
import json
json_string = json.dumps({"order_id": "ORD-7291", "total": 129.99})
# Verifikasi bahwa ini adalah JSON valid dengan mem-parsing kembali
try:
parsed = json.loads(json_string)
print(f"JSON valid dengan {len(parsed)} kunci")
except json.JSONDecodeError as e:
print(f"JSON tidak valid: {e}")
# JSON valid dengan 2 kunciKonversi CSV ke JSON dari Command Line
Konversi cepat dari terminal โ tidak perlu file skrip. Flag -c Python menjalankan kode inline, dan Anda dapat menyalurkan hasilnya melalui python3 -m json.tool untuk pretty-printing.
python3 -c " import csv, json, sys rows = list(csv.DictReader(sys.stdin)) json.dump(rows, sys.stdout, indent=2) " < inventory.csv > inventory.json
python3 -c "import csv,json,sys; print(json.dumps(list(csv.DictReader(sys.stdin))))" < data.csv | python3 -m json.tool
python3 -c "import csv,json,sys; json.dump(list(csv.DictReader(sys.stdin)),sys.stdout)" < report.csv | jq .
python3 -m json.tool adalah formatter JSON bawaan. Ia membaca JSON dari stdin, memvalidasinya, dan mencetaknya dengan indentasi 4 spasi. Berguna untuk memverifikasi bahwa konversi CSV-ke-JSON Anda menghasilkan keluaran yang valid. Jika Anda lebih menyukai indentasi 2 spasi atau membutuhkan pemfilteran, gunakan jq sebagai gantinya.Alternatif Berkinerja Tinggi โ orjson
Modul json bawaan bekerja dengan baik untuk sebagian besar file CSV. Tetapi jika Anda memproses dataset dengan puluhan ribu baris dalam sebuah loop, atau API Anda perlu melakukan serialisasi data turunan CSV pada setiap permintaan, orjson 5โ10x lebih cepat. Ditulis dalam Rust, mengembalikan bytes alih-alih str, dan melakukan serialisasi datetime, UUID, dan array numpy secara native tanpa fungsi default= kustom.
pip install orjson
import csv
import orjson
with open("telemetry_events.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
# orjson.dumps() mengembalikan bytes, bukan str
json_bytes = orjson.dumps(rows, option=orjson.OPT_INDENT_2)
with open("telemetry_events.json", "wb") as f: # catatan: "wb" untuk bytes
f.write(json_bytes)
print(f"Menulis {len(rows)} event ({len(json_bytes)} bytes)")API-nya sedikit berbeda: orjson.dumps() mengembalikan bytes dan menggunakan flag option= alih-alih argumen kata kunci. Buka file dalam mode tulis biner ("wb") saat menulis keluaran orjson. Jika Anda membutuhkan string, panggil .decode("utf-8") pada hasilnya.
Keluaran Terminal dengan Syntax Highlighting โ rich
Men-debug konversi CSV-ke-JSON di terminal menjadi lebih mudah dengan keluaran berwarna. Library rich merender JSON dengan syntax highlighting โ kunci, string, angka, dan boolean masing-masing mendapat warnanya sendiri.
pip install rich
import csv
import json
from rich.console import Console
from rich.syntax import Syntax
console = Console()
with open("deployment_log.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
json_output = json.dumps(rows[:3], indent=2, ensure_ascii=False)
syntax = Syntax(json_output, "json", theme="monokai", line_numbers=True)
console.print(syntax)rich menambahkan kode escape ANSI ke keluaran. Jangan tulis keluaran yang diformat rich ke file atau respons API โ akan berisi karakter kontrol yang tidak terlihat. Gunakan rich hanya untuk tampilan terminal.Bekerja dengan File CSV Berukuran Besar
Memuat file CSV 500 MB dengan list(csv.DictReader(f)) mengalokasikan seluruh dataset di memori, lalu json.dump() membangun string JSON penuh di atas itu. Untuk file yang lebih besar dari 50โ100 MB, beralih ke pendekatan streaming atau tulis NDJSON (newline-delimited JSON) โ satu objek JSON per baris.
NDJSON โ Satu Objek JSON Per Baris
import csv
import json
def csv_to_ndjson(csv_path: str, ndjson_path: str) -> int:
"""Konversi CSV ke NDJSON, memproses satu baris pada satu waktu."""
count = 0
with open(csv_path, "r", encoding="utf-8") as infile, \
open(ndjson_path, "w", encoding="utf-8") as outfile:
for row in csv.DictReader(infile):
outfile.write(json.dumps(row, ensure_ascii=False) + "\n")
count += 1
return count
rows_written = csv_to_ndjson("access_log.csv", "access_log.ndjson")
print(f"Menulis {rows_written} baris ke access_log.ndjson")
# Setiap baris adalah objek JSON mandiri:
# {"timestamp":"2026-03-15T09:12:00Z","method":"GET","path":"/api/v2/orders","status":"200"}
# {"timestamp":"2026-03-15T09:12:01Z","method":"POST","path":"/api/v2/payments","status":"201"}Streaming dengan ijson untuk Input JSON Berukuran Besar
import ijson # pip install ijson
def count_high_value_orders(json_path: str, threshold: float) -> int:
"""Hitung pesanan di atas ambang batas tanpa memuat seluruh file."""
count = 0
with open(json_path, "rb") as f:
for item in ijson.items(f, "item"):
if float(item.get("total", 0)) > threshold:
count += 1
return count
# Proses file JSON 2 GB dengan penggunaan memori konstan
high_value = count_high_value_orders("all_orders.json", 500.0)
print(f"Ditemukan {high_value} pesanan di atas $500")ijson digunakan untuk membaca kembali file JSON besar โ untuk sisi penulisan, pola NDJSON di atas menjaga penggunaan memori tetap konstan tanpa memandang ukuran file.Kesalahan Umum
Masalah: json.dumps() mengembalikan string. Menulisnya dengan f.write() memang berfungsi tetapi membuat string perantara yang tidak perlu di memori โ boros untuk dataset besar.
Solusi: Gunakan json.dump(data, f) untuk menulis langsung ke objek file. Ia melakukan streaming keluaran tanpa membangun string penuh terlebih dahulu.
json_string = json.dumps(rows, indent=2)
with open("output.json", "w") as f:
f.write(json_string) # string perantara yang tidak perluwith open("output.json", "w", encoding="utf-8") as f:
json.dump(rows, f, indent=2, ensure_ascii=False) # tulis langsungMasalah: csv.DictReader mengembalikan semua nilai sebagai string. Keluaran JSON berisi "quantity": "5" alih-alih "quantity": 5, yang merusak konsumen API yang memvalidasi tipe.
Solusi: Cast kolom numerik secara eksplisit dengan int() atau float() sebelum serialisasi.
rows = list(csv.DictReader(f))
json.dumps(rows)
# [{"port": "8080", "workers": "4"}] โ string, bukan angkarows = list(csv.DictReader(f))
for row in rows:
row["port"] = int(row["port"])
row["workers"] = int(row["workers"])
json.dumps(rows)
# [{"port": 8080, "workers": 4}] โ integer yang benarMasalah: Di Windows, encoding default adalah cp1252. Karakter non-ASCII (nama beraksent, teks CJK) secara diam-diam rusak atau memunculkan UnicodeDecodeError.
Solusi: Selalu berikan encoding='utf-8' ke open() untuk membaca CSV maupun menulis JSON.
with open("locations.csv", "r") as f: # menggunakan encoding default sistem
rows = list(csv.DictReader(f))with open("locations.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))Masalah: str(my_dict) menghasilkan sintaks Python (kutip tunggal, True, None) yang bukan JSON valid. API dan parser JSON akan menolaknya.
Solusi: Selalu gunakan json.dumps() untuk menghasilkan JSON valid. Ia mengonversi True ke true, None ke null, dan menggunakan tanda kutip ganda.
output = str({"active": True, "note": None})
# "{'active': True, 'note': None}" โ BUKAN JSON validoutput = json.dumps({"active": True, "note": None})
# '{"active": true, "note": null}' โ JSON validjson.dumps() vs Alternatif โ Perbandingan Singkat
Untuk sebagian besar konversi CSV-ke-JSON, kombinasi csv + json dari standard library adalah pilihan yang tepat: nol dependensi, disertakan bersama Python, bekerja di mana saja. Beralih ke orjson saat profiling menunjukkan serialisasi menjadi bottleneck โ perbedaan kecepatannya nyata pada skala besar. Gunakan pandas saat Anda juga membutuhkan pembersihan data, pemfilteran, atau agregasi sebelum mengonversi ke JSON. Jika Anda hanya membutuhkan konversi cepat tanpa menulis kode, gunakan konverter CSV ke JSON online yang menanganinya secara instan.
Pertanyaan yang Sering Diajukan
Apa perbedaan antara json.dump() dan json.dumps() di Python?
json.dump(obj, file) menulis keluaran JSON langsung ke objek file (apa pun yang memiliki metode .write()). json.dumps(obj) mengembalikan string berformat JSON. Gunakan json.dump() saat menulis ke file, json.dumps() saat Anda membutuhkan JSON sebagai string Python untuk logging, menyematkan dalam payload, atau mengirim melalui socket. Keduanya menerima argumen kata kunci yang sama (indent, sort_keys, ensure_ascii, default).
Bagaimana cara mengonversi dictionary Python ke string JSON?
Panggil json.dumps(your_dict). Nilai yang dikembalikan adalah str yang berisi JSON valid. Tambahkan indent=2 untuk keluaran yang mudah dibaca. Jika dictionary Anda berisi nilai non-ASCII, berikan ensure_ascii=False untuk mempertahankan karakter seperti huruf beraksent atau teks CJK.
import json
server_config = {"host": "api.internal", "port": 8443, "debug": False}
json_string = json.dumps(server_config, indent=2)
print(json_string)
# {
# "host": "api.internal",
# "port": 8443,
# "debug": false
# }Bagaimana cara menyimpan list of dicts Python sebagai file JSON?
Buka file dalam mode tulis dengan encoding UTF-8, lalu panggil json.dump(your_list, f, indent=2, ensure_ascii=False). Selalu gunakan json.dump() (bukan json.dumps()) untuk keluaran file โ ia menulis langsung ke file handle tanpa membuat string perantara di memori.
import json
records = [
{"order_id": "ORD-4821", "total": 129.99, "currency": "USD"},
{"order_id": "ORD-4822", "total": 89.50, "currency": "EUR"},
]
with open("orders.json", "w", encoding="utf-8") as f:
json.dump(records, f, indent=2, ensure_ascii=False)Mengapa json.dumps() mengubah True menjadi true dan None menjadi null?
Boolean Python (True, False) dan None bukan token JSON yang valid. Spesifikasi JSON menggunakan true, false, dan null dengan huruf kecil. json.dumps() menangani pemetaan ini secara otomatis โ True menjadi true, False menjadi false, None menjadi null. Anda tidak perlu mengonversinya secara manual. Sebaliknya, json.loads() memetakan kembali ke tipe Python.
Bagaimana cara menangani objek datetime saat mengonversi data CSV ke JSON?
Berikan fungsi default= ke json.dumps() yang mengonversi objek datetime ke string ISO 8601. Fungsi default dipanggil untuk setiap objek yang tidak dapat diserialisasi secara native oleh json. Kembalikan obj.isoformat() untuk instance datetime dan raise TypeError untuk yang lainnya.
import json
from datetime import datetime
def json_default(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Not serializable: {type(obj)}")
event = {"action": "login", "timestamp": datetime(2026, 3, 15, 9, 30, 0)}
print(json.dumps(event, default=json_default))
# {"action": "login", "timestamp": "2026-03-15T09:30:00"}Apakah bisa mengonversi CSV ke JSON tanpa pandas?
Ya. Standard library Python sudah menyediakan semua yang dibutuhkan. Gunakan csv.DictReader untuk membaca setiap baris sebagai dictionary, kumpulkan baris-baris tersebut ke dalam list, dan serialisasi dengan json.dump() atau json.dumps(). Tidak diperlukan library pihak ketiga. pandas hanya perlu ditambahkan jika Anda juga membutuhkan pembersihan data, inferensi tipe, atau sudah menggunakannya di bagian lain proyek.
import csv
import json
with open("inventory.csv", "r", encoding="utf-8") as csv_file:
rows = list(csv.DictReader(csv_file))
with open("inventory.json", "w", encoding="utf-8") as json_file:
json.dump(rows, json_file, indent=2, ensure_ascii=False)Untuk alternatif satu klik tanpa menulis Python apa pun, coba konverter CSV ke JSON โ tempel data CSV Anda dan dapatkan keluaran JSON terformat secara langsung.
Alat Terkait
Maria is a backend developer specialising in Python and API integration. She has broad experience with data pipelines, serialisation formats, and building reliable server-side services. She is an active member of the Python community and enjoys writing practical, example-driven guides that help developers solve real problems without unnecessary theory.
Priya is a data scientist and machine learning engineer who has worked across the full Python data stack โ from raw data ingestion and cleaning to model deployment and monitoring. She is passionate about reproducible research, Jupyter-based workflows, and the practical engineering side of ML. She writes about NumPy, Pandas, data serialisation, and the Python patterns that make data pipelines reliable at scale.