Konversi CSV ke JSON di Python โ€” Panduan json.dumps()

ยทBackend DeveloperยทDitinjau olehPriya SharmaยทDiterbitkan

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.
Before ยท json
After ยท json
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"
  }
]
Catatan:Perhatikan bahwa quantity dan price muncul sebagai string JSON ("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

Python 3.10+
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:

Python 3.10+ โ€” pretty-printed output
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.

Python 3.10+ โ€” sort_keys and ensure_ascii
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=(",", ":").

Catatan:Dict Python dan objek JSON terlihat hampir identik saat dicetak. Perbedaannya: 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.

Python 3.10+ โ€” full CSV to JSON conversion
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():

Python 3.10+ โ€” CSV rows as JSON string
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.

Python 3.10+ โ€” type coercion for CSV rows
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.

Python 3.10+ โ€” default= for datetime, UUID, Decimal
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"
# }
Peringatan:Selalu raise 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().

Python 3.10+ โ€” dataclass serialization
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"
# }
Catatan: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.

Parameter
Tipe
Default
Deskripsi
obj
Any
(wajib)
Objek Python yang akan diserialisasi โ€” dict, list, str, int, float, bool, None
indent
int | str | None
None
Jumlah spasi (atau string) per tingkat indentasi. None = keluaran satu baris kompak
sort_keys
bool
False
Urutkan kunci dictionary secara alfabetis pada keluaran
ensure_ascii
bool
True
Escape semua karakter non-ASCII sebagai \\uXXXX. Setel False untuk menghasilkan UTF-8 langsung
default
Callable | None
None
Fungsi yang dipanggil untuk objek yang tidak dapat diserialisasi secara default โ€” kembalikan nilai yang dapat diserialisasi atau raise TypeError
separators
tuple[str, str] | None
None
Override (item_separator, key_separator). Gunakan (",", ":") untuk keluaran kompak tanpa spasi
skipkeys
bool
False
Lewati kunci dict yang bukan str, int, float, bool, atau None alih-alih raise TypeError
allow_nan
bool
True
Izinkan float("nan"), float("inf"), float("-inf"). Setel False untuk raise ValueError pada nilai-nilai ini
cls
Type[JSONEncoder] | None
None
Subkelas JSONEncoder kustom untuk digunakan sebagai pengganti default

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].

Python 3.10+ โ€” DictReader with custom delimiter
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"
#   }
# ]
Peringatan: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

Python 3.10+ โ€” file conversion with error handling
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

Python 3.10+ โ€” API CSV response to 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.

Python 3.10+ โ€” round-trip validation
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 kunci

Konversi 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.

bash โ€” one-liner CSV to JSON
python3 -c "
import csv, json, sys
rows = list(csv.DictReader(sys.stdin))
json.dump(rows, sys.stdout, indent=2)
" < inventory.csv > inventory.json
bash โ€” pipe CSV file and format with json.tool
python3 -c "import csv,json,sys; print(json.dumps(list(csv.DictReader(sys.stdin))))" < data.csv | python3 -m json.tool
bash โ€” convert and validate with jq
python3 -c "import csv,json,sys; json.dump(list(csv.DictReader(sys.stdin)),sys.stdout)" < report.csv | jq .
Catatan: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.

bash โ€” install orjson
pip install orjson
Python 3.10+ โ€” CSV to JSON with 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.

bash โ€” install rich
pip install rich
Python 3.10+ โ€” rich JSON output
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)
Peringatan: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

Python 3.10+ โ€” streaming CSV to NDJSON
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

Python 3.10+ โ€” ijson for reading large JSON
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")
Catatan:Beralih ke NDJSON atau streaming saat CSV melebihi 50โ€“100 MB. 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

โŒ Menggunakan json.dumps() lalu menulis ke file secara terpisah

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.

Before ยท Python
After ยท Python
json_string = json.dumps(rows, indent=2)
with open("output.json", "w") as f:
    f.write(json_string)  # string perantara yang tidak perlu
with open("output.json", "w", encoding="utf-8") as f:
    json.dump(rows, f, indent=2, ensure_ascii=False)  # tulis langsung
โŒ Lupa melakukan cast nilai string CSV ke angka

Masalah: 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.

Before ยท Python
After ยท Python
rows = list(csv.DictReader(f))
json.dumps(rows)
# [{"port": "8080", "workers": "4"}]  โ† string, bukan angka
rows = 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 benar
โŒ Tidak menyertakan encoding='utf-8' saat membuka file

Masalah: 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.

Before ยท Python
After ยท Python
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))
โŒ Menggunakan str() atau repr() alih-alih json.dumps()

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.

Before ยท Python
After ยท Python
output = str({"active": True, "note": None})
# "{'active': True, 'note': None}"  โ† BUKAN JSON valid
output = json.dumps({"active": True, "note": None})
# '{"active": true, "note": null}'  โ† JSON valid

json.dumps() vs Alternatif โ€” Perbandingan Singkat

Metode
Keluaran
JSON Valid
Tipe Kustom
Kecepatan
Perlu Instalasi
json.dumps()
str
โœ“
via parameter default=
Baseline
Tidak (stdlib)
json.dump()
tulis ke file
โœ“
via parameter default=
Baseline
Tidak (stdlib)
csv.DictReader + json
str atau file
โœ“
via parameter default=
Baseline
Tidak (stdlib)
pandas to_json()
str atau file
โœ“
โœ“ datetime native
~2x lebih cepat untuk data besar
pip install pandas
orjson.dumps()
bytes
โœ“
โœ“ datetime/UUID native
5โ€“10x lebih cepat
pip install orjson
dataclasses.asdict() + json
str
โœ“
via parameter default=
Baseline
Tidak (stdlib)
polars write_json()
str atau file
โœ“
โœ“ datetime native
~3x lebih cepat untuk data besar
pip install polars

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.

Python 3.10+
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.

Python 3.10+
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.

Python 3.10+
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.

Python 3.10+
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

MS
Maria SantosBackend Developer

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.

PS
Priya SharmaPeninjau teknis

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.