Skip to content
Kembali ke Blog
Tutorial

Konversi CSV ke JSON: Metode, Jebakan & Contoh Kode

Konversi CSV ke JSON dan sebaliknya dengan Python, JavaScript & alat CLI. Mencakup jebakan encoding, koersi tipe, streaming file besar, dan contoh kode lengkap.

12 menit baca

Panduan Konversi CSV ke JSON: Metode, Jebakan & Praktik Terbaik

Tim operasional Anda mengirim ekspor CSV. API Anda mengharapkan JSON. Anda membuka file tersebut, menatap 10.000 baris nilai yang dipisahkan koma, dan bertanya-tanya: apa cara tercepat untuk mengonversi CSV ke JSON tanpa kehilangan data?

Artikel ini membahas empat metode konversi (alat browser, JavaScript, Python, CLI), arah sebaliknya (JSON ke CSV), lima jebakan yang diam-diam merusak data, dan cara menangani file yang terlalu besar untuk muat di memori.

CSV vs JSON: Kapan Menggunakan Yang Mana

Sebelum mengonversi, ada baiknya memahami apa keunggulan masing-masing format.

DimensiCSVJSON
StrukturTabel datar (baris dan kolom)Hierarki bersarang (objek, array)
Tipe dataSemuanya adalah stringstring, number, boolean, null
Keterbacaan manusiaRamah spreadsheetRamah developer
Penggunaan utamaEkspor/impor data, laporan, ETLAPI, file konfigurasi, penyimpanan NoSQL
Ukuran fileLebih kecil (tanpa nama key yang berulang)Lebih besar (nama key berulang per record)
SkemaImplisit (baris header)Eksplisit (atau gunakan JSON Schema)

Aturan praktis: Gunakan CSV ketika data Anda tabular dan konsumennya adalah spreadsheet atau pipeline data. Gunakan JSON ketika data Anda memiliki hierarki atau konsumennya adalah API. Anda selalu dapat memvalidasi output JSON dengan JSON Formatter untuk menangkap masalah struktural lebih awal.

Jika proyek Anda menggunakan format JSON yang santai seperti JSON5 atau JSONC untuk konfigurasi, lihat panduan formatting JSON5 dan JSONC kami untuk perbedaan sintaks dan tooling.

4 Cara Mengonversi CSV ke JSON

Metode 1 — Alat Berbasis Browser

Untuk konversi satu kali, pendekatan berbasis browser adalah jalur tercepat. Tempel CSV Anda ke konverter online, dapatkan JSON, lalu validasi hasilnya di JSON Formatter untuk mengonfirmasi strukturnya sudah benar.

Keuntungannya: data Anda tidak pernah meninggalkan browser. Tanpa upload, tanpa pemrosesan server, tanpa masalah privasi. Ini penting ketika Anda bekerja dengan data internal, kunci API yang tertanam dalam ekspor, atau apa pun yang lebih baik tidak Anda kirim ke server pihak ketiga.

Terbaik untuk: file kecil (di bawah 10 MB), konversi cepat satu kali, dan anggota tim non-teknis.

Metode 2 — JavaScript / Node.js

Browser (vanilla JS):

function csvToJson(csv) {
  const lines = csv.trim().split('\n');
  const headers = lines[0].split(',').map(h => h.trim());

  return lines.slice(1).map(line => {
    const values = line.split(',');
    return headers.reduce((obj, header, i) => {
      obj[header] = values[i]?.trim() ?? '';
      return obj;
    }, {});
  });
}

const csv = `name,age,city
Alice,30,New York
Bob,25,London`;

console.log(JSON.stringify(csvToJson(csv), null, 2));

Ini bekerja untuk CSV sederhana tanpa field bertanda kutip. Untuk penggunaan produksi dengan koma di dalam nilai, newline di field, atau string bertanda kutip, gunakan parser yang tepat.

Node.js (csv-parser + stream):

import { createReadStream } from 'fs';
import { parse } from 'csv-parse';

const records = [];

createReadStream('data.csv')
  .pipe(parse({ columns: true, trim: true, skip_empty_lines: true }))
  .on('data', (row) => records.push(row))
  .on('end', () => {
    console.log(JSON.stringify(records, null, 2));
  });

Opsi columns: true menggunakan baris pertama sebagai key. Opsi trim menghapus whitespace dari nilai. Ini menangani field bertanda kutip, koma yang di-escape, dan nilai multiline dengan benar.

Metode 3 — Python

Library standar (tanpa dependensi):

import csv
import json

with open('data.csv', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    rows = list(reader)

with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(rows, f, indent=2, ensure_ascii=False)

csv.DictReader memetakan setiap baris ke dictionary menggunakan baris header sebagai key. Flag ensure_ascii=False mempertahankan karakter Unicode (Indonesia, Jepang, karakter beraksen) alih-alih meng-escape-nya ke \uXXXX.

Pandas (one-liner untuk data scientist):

import pandas as pd

df = pd.read_csv('data.csv')
df.to_json('data.json', orient='records', indent=2, force_ascii=False)

Kapan menggunakan yang mana:

  • csv + json: Script ringan, fungsi Lambda, container di mana Anda menginginkan dependensi minimal.
  • pandas: Ketika Anda juga perlu membersihkan, memfilter, atau mentransformasi data sebelum mengonversi. Overhead mengimpor pandas sepadan ketika Anda melakukan lebih dari sekadar konversi format.

Metode 4 — Alat CLI

Untuk shell script dan pipeline otomasi:

csvkit:

# Install: pip install csvkit
csvjson data.csv > data.json

Miller (mlr):

# Install: brew install miller (macOS) atau apt install miller (Ubuntu)
mlr --csv --json cat data.csv > data.json

Pipe dengan jq untuk filtering:

# Konversi dan filter dalam satu pipeline
csvjson data.csv | jq '[.[] | select(.age | tonumber > 25)]'

Miller sangat powerful karena menangani CSV, JSON, TSV, dan format lain secara native. Anda dapat mentransformasi data selama konversi:

# Konversi CSV ke JSON, rename field, tambahkan field komputasi
mlr --csv --json rename name,fullName then put '$age_group = ($age > 30) ? "senior" : "junior"' data.csv

JSON ke CSV: Menangani Arah Sebaliknya

Mengonversi JSON ke CSV menimbulkan tantangan yang tidak ada di arah maju.

Meratakan Objek Bersarang

CSV pada dasarnya datar. Ketika JSON Anda memiliki objek bersarang, Anda membutuhkan strategi perataan:

{
  "name": "Alice",
  "address": {
    "city": "New York",
    "zip": "10001"
  }
}

Menjadi:

nameaddress.cityaddress.zip
AliceNew York10001

Konvensi dot-notation (address.city) adalah pendekatan paling umum. Di Python:

import pandas as pd

data = [
    {"name": "Alice", "address": {"city": "New York", "zip": "10001"}},
    {"name": "Bob", "address": {"city": "London", "zip": "EC1A"}}
]

df = pd.json_normalize(data)
df.to_csv('output.csv', index=False)
# Kolom: name, address.city, address.zip

Menangani Array

Field array membutuhkan keputusan:

StrategiInput contohOutput CSVTerbaik untuk
Gabung sebagai string["admin","editor"]admin;editorList sederhana, dapat diimpor ulang
Perluas ke kolom["admin","editor"]role_0: admin, role_1: editorArray panjang tetap
Perluas ke baris["admin","editor"]Dua baris, satu per peranAnalisis relasional

Pilih berdasarkan konsumen hilir Anda. Jika CSV masuk kembali ke database, memperluas ke baris biasanya paling masuk akal.

Kehilangan Informasi Tipe

CSV tidak memiliki sistem tipe. Ketika Anda mengonversi JSON ke CSV:

  • true menjadi string "true" — apakah ini boolean atau string?
  • null menjadi sel kosong — tidak dapat dibedakan dari string kosong ""
  • 42 menjadi "42" — apakah ini angka atau string?

Jika kesetiaan round-trip penting (CSV → proses → JSON), dokumentasikan konvensi tipe Anda di komentar header atau file skema pendamping.

5 Jebakan Umum & Cara Menghindarinya

Masalah-masalah ini diam-diam merusak data dan jarang dibahas di tutorial lain.

1. Ranjau Encoding

Masalahnya: Anda membuka CSV dari rekan kerja dan melihat é alih-alih é, atau 锟斤拷 alih-alih karakter CJK.

Mengapa terjadi: File disimpan dalam satu encoding (Windows-1252, GBK, Shift_JIS) tetapi parser Anda mengasumsikan UTF-8. Excel di Windows sering menyimpan CSV sebagai Windows-1252 atau menambahkan UTF-8 BOM (Byte Order Mark — \xEF\xBB\xBF tak terlihat di awal file).

Solusinya:

# Deteksi encoding terlebih dahulu
import chardet

with open('data.csv', 'rb') as f:
    result = chardet.detect(f.read(10000))
    print(result)  # {'encoding': 'Windows-1252', 'confidence': 0.73}

# Lalu baca dengan encoding yang benar
with open('data.csv', encoding=result['encoding']) as f:
    reader = csv.DictReader(f)
    # ...

Di Node.js, hapus BOM secara eksplisit:

import { readFileSync } from 'fs';

let content = readFileSync('data.csv', 'utf-8');
// Hapus UTF-8 BOM jika ada
if (content.charCodeAt(0) === 0xFEFF) {
  content = content.slice(1);
}

2. Kebingungan Delimiter

Masalahnya: Parser Anda menghasilkan satu kolom raksasa alih-alih beberapa field.

Mengapa terjadi: Di banyak locale Eropa (Prancis, Jerman, Spanyol), Excel menggunakan titik koma (;) sebagai delimiter CSV karena koma digunakan sebagai pemisah desimal (mis., 3,14 alih-alih 3.14). File tab-separated (.tsv) menambahkan varian lain.

Solusinya: Auto-deteksi delimiter dengan mengambil sampel beberapa baris pertama:

import csv

with open('data.csv') as f:
    sample = f.read(8192)
    dialect = csv.Sniffer().sniff(sample, delimiters=',;\t|')
    f.seek(0)
    reader = csv.DictReader(f, dialect=dialect)

3. Nol di Depan Menghilang

Masalahnya: Kode pos 00501 menjadi 501. Kode produk 007 menjadi 7.

Mengapa terjadi: Parser (atau Excel) menginterpretasikan field sebagai angka dan menghapus nol di depan. Ini sangat berbahaya untuk kode pos, nomor telepon, dan kode ID.

Solusinya: Paksa typing string. Di pandas:

df = pd.read_csv('data.csv', dtype={'zip': str, 'product_code': str})

Di JavaScript, periksa apakah string asli berbeda dari parse numeriknya:

function preserveLeadingZeros(value) {
  if (/^0\d+$/.test(value)) return value; // Simpan sebagai string
  const num = Number(value);
  return isNaN(num) ? value : num;
}

4. Kehilangan Presisi Angka Besar

Masalahnya: ID 9007199254740993 menjadi 9007199254740992 di JSON Anda.

Mengapa terjadi: Number JavaScript adalah float 64-bit (IEEE 754). Integer di atas Number.MAX_SAFE_INTEGER (2^53 - 1 = 9007199254740991) kehilangan presisi. Ini mempengaruhi ID database, Snowflake ID, dan ID posting Twitter/X.

Solusinya: Simpan angka besar sebagai string di JSON, atau gunakan BigInt dalam kode pemrosesan Anda:

// Parse dengan preservasi string untuk angka besar
function safeParseNumber(value) {
  const num = Number(value);
  if (Number.isInteger(num) && !Number.isSafeInteger(num)) {
    return value; // Simpan sebagai string untuk mempertahankan presisi
  }
  return isNaN(num) ? value : num;
}

5. Ambiguitas Nilai Kosong

Masalahnya: CSV Anda memiliki sel kosong. Setelah konversi, Anda tidak dapat membedakan apakah nilai aslinya adalah string kosong "", null, atau memang tidak ada.

Mengapa terjadi: CSV tidak memiliki cara untuk membedakan ketiga keadaan ini. Field kosong antara dua koma (Alice,,30) bisa berarti salah satunya.

Solusinya: Definisikan konvensi dan terapkan secara konsisten:

def parse_value(value):
    if value == '':
        return None        # atau '' — pilih satu konvensi
    if value == 'NULL' or value == 'null':
        return None
    return value

Jika data Anda menggunakan nilai sentinel seperti NULL, N/A, atau -, dokumentasikan dan tangani secara eksplisit.

Streaming File Besar

Ketika CSV Anda melebihi 100 MB, memuat seluruhnya ke memori bukan pilihan. Gunakan streaming.

Node.js (stream pipeline):

import { createReadStream, createWriteStream } from 'fs';
import { parse } from 'csv-parse';
import { Transform } from 'stream';
import { pipeline } from 'stream/promises';

let first = true;
const toJsonArray = new Transform({
  objectMode: true,
  transform(record, encoding, callback) {
    const prefix = first ? '[\n' : ',\n';
    first = false;
    callback(null, prefix + JSON.stringify(record));
  },
  flush(callback) {
    callback(null, '\n]');
  }
});

await pipeline(
  createReadStream('large.csv'),
  parse({ columns: true, trim: true }),
  toJsonArray,
  createWriteStream('large.json')
);

Python (generator):

import csv
import json

def csv_rows(path):
    with open(path, encoding='utf-8') as f:
        reader = csv.DictReader(f)
        for row in reader:
            yield row

# Stream ke format JSON Lines (satu objek JSON per baris)
with open('large.jsonl', 'w', encoding='utf-8') as out:
    for row in csv_rows('large.csv'):
        out.write(json.dumps(row, ensure_ascii=False) + '\n')

Untuk file yang sangat besar, pertimbangkan JSON Lines (.jsonl) alih-alih array JSON tunggal. Setiap baris adalah objek JSON independen, yang berarti Anda dapat memproses file output baris per baris juga — tidak perlu mem-parse semuanya sekaligus.

FAQ

Apa perbedaan antara CSV dan JSON?

CSV (Comma-Separated Values) menyimpan data sebagai tabel datar di mana setiap nilai adalah string. JSON (JavaScript Object Notation) menyimpan data terstruktur dengan objek bersarang, array, dan nilai bertipe (string, number, boolean, null). CSV lebih kecil dan ramah spreadsheet; JSON lebih ekspresif dan ramah API.

Bagaimana cara mengonversi CSV ke JSON di JavaScript?

Gunakan package csv-parse di Node.js: baca file dengan createReadStream, pipe melalui parse({ columns: true }), dan kumpulkan hasilnya. Untuk penggunaan browser, baca file dengan FileReader, pisahkan berdasarkan newline, dan petakan baris ke objek menggunakan baris header sebagai key.

Bagaimana cara mengonversi CSV ke JSON di Python?

Gunakan csv.DictReader dari library standar untuk membaca baris sebagai dictionary, lalu json.dump() untuk menulisnya sebagai array JSON. Untuk manipulasi data sebelum konversi, pandas.read_csv() diikuti df.to_json(orient='records') adalah alternatif one-liner.

Bisakah JSON bersarang dikonversi ke CSV?

Ya, tetapi Anda membutuhkan strategi perataan. Pendekatan paling umum menggunakan dot notation: field seperti address.city menjadi header kolom. Di Python, pandas.json_normalize() menangani ini secara otomatis. Array membutuhkan keputusan tambahan — gabung sebagai string, perluas ke kolom, atau perluas ke baris.

Mengapa CSV saya memiliki karakter kacau setelah konversi?

Ketidakcocokan encoding. File kemungkinan disimpan dalam Windows-1252 atau GBK, tetapi parser Anda mengasumsikan UTF-8. Gunakan library deteksi seperti chardet (Python) untuk mengidentifikasi encoding, lalu tentukan secara eksplisit saat membaca. Periksa juga UTF-8 BOM yang ditambahkan beberapa alat secara otomatis.

Bagaimana cara menangani file CSV lebih besar dari 100 MB?

Gunakan streaming alih-alih memuat seluruh file ke memori. Di Node.js, pipe melalui csv-parse dengan stream. Di Python, iterasi dengan csv.DictReader menggunakan generator. Pertimbangkan output format JSON Lines (.jsonl) alih-alih array JSON tunggal untuk pemrosesan hilir yang lebih mudah.

Bagaimana cara memverifikasi bahwa JSON hasil konversi valid?

Tempel output ke JSON Formatter online untuk memeriksa sintaks, struktur, dan nesting. Untuk validasi otomatis, gunakan JSON.parse() di JavaScript atau json.loads() di Python — keduanya melempar error yang jelas pada input yang tidak valid. Untuk validasi skema, definisikan JSON Schema dan validasi secara programatik.

Poin-Poin Penting

  1. Pilih metode yang tepat untuk konteks Anda: alat browser untuk satu kali cepat, kode untuk otomasi, CLI untuk pipeline.
  2. Waspadai masalah encoding — selalu tentukan encoding secara eksplisit daripada mengandalkan default.
  3. Pertahankan tipe secara sengaja — nol di depan, integer besar, dan nilai null semuanya membutuhkan penanganan eksplisit.
  4. Streaming file besar alih-alih memuatnya ke memori. Pertimbangkan format JSON Lines untuk dataset yang sangat besar.
  5. Validasi output Anda — jalankan JSON yang dikonversi melalui JSON Formatter untuk menangkap masalah struktural sebelum mencapai produksi.

Artikel Terkait

Lihat semua artikel