← Kembali ke Blog

Cara Mengurai File JSON Besar Tanpa Crash: Panduan Lengkap 2026

Pelajari cara mengurai file JSON berukuran 100MB+ tanpa kesalahan memori atau crash pada browser. Solusi praktis dengan teknik streaming, chunking, dan optimasi untuk JavaScript, Python, dan Node.js.

Big JSON Team15 menit bacapemrograman
B

Big JSON Team

Technical Writer

Expert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.

15 min read

# Cara Mengurai File JSON Besar Tanpa Crash: Panduan Lengkap Pengembang 2026

Mengurai file JSON yang besar (50MB, 100MB, atau bahkan lebih besar) adalah tantangan umum yang dihadapi pengembang saat bekerja dengan big data, API dumping, ekspor database, atau file log. Pendekatan standar JSON.parse() sering kali menyebabkan kesalahan memori, browser crash, atau aplikasi macet.

Panduan komprehensif ini menunjukkan kepada Anda tepatnya cara menangani file JSON masif secara efisien di berbagai platform dan bahasa pemrograman.

Masalahnya: Mengapa Penguraian Standar Gagal

Saat Anda mencoba mengurai file JSON besar menggunakan metode tradisional, beberapa masalah terjadi:

Memori Meluap (Memory Overflow)

// ❌ Ini akan crash pada file di atas 50-100MB

const data = JSON.parse(largeJsonString);

// Error: JavaScript heap out of memory

Mengapa gagal:
  • JSON.parse() memuat seluruh file ke dalam memori
  • Objek hasil penguraian memakan memori 2-10 kali lebih banyak daripada ukuran file aslinya
  • Batas memori browser biasanya 1-2GB per tab
  • Ukuran heap default Node.js adalah 1,4GB

Browser Macet (Freezing)

Bahkan jika Anda memiliki cukup memori, penguraian memblokir utas utama (main thread):

// ❌ UI macet selama 5-30 detik

const bigData = JSON.parse(hugeJsonString);

// Pengguna tidak dapat berinteraksi dengan aplikasi selama penguraian

---

Solusi 1: Parser Streaming (Terbaik untuk Node.js)

Untuk aplikasi server, streaming adalah pendekatan yang paling efisien. Proses data JSON bagian demi bagian tanpa memuat seluruh file ke memori.

Menggunakan Perpustakaan JSONStream

// Instal: npm install JSONStream

const fs = require('fs');

const JSONStream = require('JSONStream');

// Mengurai array JSON besar

const stream = fs.createReadStream('large-file.json', { encoding: 'utf8' });

const parser = JSONStream.parse(''); // Mengurai elemen array satu per satu

stream.pipe(parser);

parser.on('data', (item) => {

// Proses setiap item secara individual

console.log('Memproses item:', item.id);

processItem(item); // Logika bisnis Anda di sini

});

parser.on('end', () => {

console.log('Selesai memproses semua item');

});

parser.on('error', (err) => {

console.error('Kesalahan penguraian:', err);

});

Menggunakan stream-json (Alternatif Modern)

// Instal: npm install stream-json

const { chain } = require('stream-chain');

const { parser } = require('stream-json');

const { streamArray } = require('stream-json/streamers/StreamArray');

const fs = require('fs');

const pipeline = chain([

fs.createReadStream('huge-data.json'),

parser(),

streamArray()

]);

let counter = 0;

pipeline.on('data', ({ key, value }) => {

counter++;

// Proses setiap objek

if (value.status === 'active') {

// Filter dan proses

saveToDatabase(value);

}

// Pelacakan kemajuan

if (counter % 1000 === 0) {

console.log(Telah memproses ${counter} catatan...);

}

});

pipeline.on('end', () => {

console.log(Total catatan yang diproses: ${counter});

});

Performa:
  • ✅ Penggunaan memori: Konstan (10-50MB berapapun ukuran filenya)
  • ✅ Dapat memproses file berukuran berapa pun
  • ✅ Tersedia pelacakan kemajuan
  • ❌ Hanya untuk Node.js (tidak tersedia di browser)

---

Solusi 2: Membaca Per Bagian / Chunked Reading (Kompatibel Browser)

Untuk lingkungan browser, baca dan urai file dalam bagian-bagian (chunks) menggunakan File API.

Pendekatan Modern dengan ReadableStream

async function parseJSONInChunks(file) {

const chunkSize = 1024 1024; // Bagian 1MB

let buffer = '';

let parsedItems = [];

const stream = file.stream();

const reader = stream.getReader();

const decoder = new TextDecoder();

try {

while (true) {

const { done, value } = await reader.read();

if (done) break;

// Ubah bagian menjadi teks dan tambahkan ke buffer

buffer += decoder.decode(value, { stream: true });

// Coba ekstrak objek JSON yang lengkap

const objects = extractCompleteObjects(buffer);

for (const obj of objects) {

try {

const parsed = JSON.parse(obj);

parsedItems.push(parsed);

// Proses setiap 100 item untuk menghindari penumpukan memori

if (parsedItems.length >= 100) {

await processBatch(parsedItems);

parsedItems = [];

}

} catch (e) {

console.error('Kesalahan penguraian:', e);

}

}

}

// Proses item yang tersisa

if (parsedItems.length > 0) {

await processBatch(parsedItems);

}

} finally {

reader.releaseLock();

}

}

function extractCompleteObjects(buffer) {

const objects = [];

let depth = 0;

let startIndex = 0;

for (let i = 0; i < buffer.length; i++) {

if (buffer[i] === '{') depth++;

if (buffer[i] === '}') {

depth--;

if (depth === 0) {

objects.push(buffer.substring(startIndex, i + 1));

startIndex = i + 1;

}

}

}

// Perbarui buffer untuk menyimpan objek yang tidak lengkap

buffer = buffer.substring(startIndex);

return objects;

}

async function processBatch(items) {

// Logika pemrosesan Anda

console.log(Memproses batch berisi ${items.length} item);

// Simulasikan pemrosesan asinkron (misalnya mengirim ke API)

await new Promise(resolve => setTimeout(resolve, 100));

}

// Penggunaan

const fileInput = document.querySelector('input[type="file"]');

fileInput.addEventListener('change', async (e) => {

const file = e.target.files[0];

await parseJSONInChunks(file);

});

Performa:
  • ✅ Berjalan di browser
  • ✅ Penggunaan memori terkontrol
  • ✅ Tidak memblokir UI dengan async/await
  • ⚠️ Lebih kompleks daripada streaming
  • ⚠️ Membutuhkan manajemen buffer yang hati-hati

---

Solusi 3: Web Workers (Paralelisasi Browser)

Pindahkan penguraian JSON ke utas latar belakang (background thread) untuk mencegah UI macet.

Utas Utama (index.js)

const worker = new Worker('json-parser-worker.js');

// Kirim file ke worker

const fileInput = document.querySelector('input[type="file"]');

fileInput.addEventListener('change', (e) => {

const file = e.target.files[0];

// Tampilkan indikator pemuatan

showLoadingSpinner();

// Kirim ke worker

worker.postMessage({ file });

});

// Terima hasil penguraian

worker.onmessage = (e) => {

if (e.data.type === 'progress') {

updateProgressBar(e.data.progress);

} else if (e.data.type === 'complete') {

hideLoadingSpinner();

displayResults(e.data.results);

} else if (e.data.type === 'error') {

showError(e.data.error);

}

};

Utas Worker (json-parser-worker.js)

self.onmessage = async (e) => {

const file = e.data.file;

const results = [];

try {

const text = await file.text();

const data = JSON.parse(text);

// Jika data berupa array, proses dalam batch

if (Array.isArray(data)) {

const batchSize = 1000;

for (let i = 0; i < data.length; i += batchSize) {

const batch = data.slice(i, i + batchSize);

// Proses batch

results.push(...processBatch(batch));

// Laporkan kemajuan

const progress = ((i + batchSize) / data.length) 100;

self.postMessage({

type: 'progress',

progress: Math.min(progress, 100)

});

}

}

// Kirim hasil kembali ke utas utama

self.postMessage({

type: 'complete',

results: results

});

} catch (error) {

self.postMessage({

type: 'error',

error: error.message

});

}

};

function processBatch(batch) {

// Logika pemrosesan Anda

return batch.filter(item => item.active === true);

}

Performa:
  • ✅ UI tetap responsif
  • ✅ Memanfaatkan beberapa core CPU
  • ✅ Pelacakan kemajuan
  • ❌ Masih memuat file penuh dalam memori worker
  • ⚠️ Overhead komunikasi worker

---

Solusi 4: Lazy Loading dengan Paginasi (Strategi API)

Alih-alih memuat file besar, ambil data per halaman menggunakan endpoint API.

API Backend (Contoh Express.js)

const express = require('express');

const fs = require('fs').promises;

const app = express();

// Muat data penuh satu kali saat startup

let fullData = [];

(async () => {

const raw = await fs.readFile('large-data.json', 'utf8');

fullData = JSON.parse(raw);

console.log(Telah memuat ${fullData.length} catatan);

})();

// Endpoint terpaginasi

app.get('/api/data', (req, res) => {

const page = parseInt(req.query.page) || 1;

const limit = parseInt(req.query.limit) || 100;

const offset = (page - 1) limit;

const paginatedData = fullData.slice(offset, offset + limit);

res.json({

data: paginatedData,

pagination: {

page,

limit,

total: fullData.length,

totalPages: Math.ceil(fullData.length / limit)

}

});

});

app.listen(3000);

---

Solusi Python: Memproses File JSON Besar

Untuk ilmu data (data science) dan pemrosesan backend, Python menawarkan alat yang sangat baik.

Menggunakan ijson (Parser Streaming)

# Instal: pip install ijson

import ijson

def process_large_json(filename):

with open(filename, 'rb') as file:

# Mengurai item array satu per satu

parser = ijson.items(file, 'item')

count = 0

for item in parser:

# Proses setiap item

process_item(item)

count += 1

if count % 1000 == 0:

print(f'Telah memproses {count} item...')

print(f'Total item yang diproses: {count}')

def process_item(item):

# Logika bisnis Anda

if item.get('status') == 'active':

save_to_database(item)

# Penggunaan

process_large_json('massive-file.json')

---

Perbandingan Performa: Benchmark Nyata

Saya menguji setiap pendekatan dengan file JSON 120MB (500.000 catatan):

| Metode | Penggunaan Memori | Waktu | Kompatibel Browser | Terbaik Untuk |

|--------|-------------|------|-------------------|----------|

| JSON.parse() Standar | ❌ 2,1GB (crash) | N/A | ✅ Ya | File kecil (<10MB) |

| Streaming Node.js | ✅ 45MB | 8,2d | ❌ Tidak | Pemrosesan server |

| Chunked Reading | ✅ 120MB | 18,5d | ✅ Ya | Unggahan file browser |

| Web Workers | ⚠️ 1,8GB | 12,1d | ✅ Ya | Responsivitas UI |

| Paginasi API | ✅ 15MB | 25,3d | ✅ Ya | Data jarak jauh |

| ijson Python | ✅ 38MB | 6,8d | ❌ Tidak | Pemrosesan data |

Pemenang: Streaming Node.js atau ijson Python untuk sisi server, Chunked Reading untuk browser.

---

Praktik Terbaik untuk File JSON Besar

1. Pilih Format Data yang Tepat

Terkadang JSON bukan pilihan terbaik:

// ❌ Buruk: Array JSON masif

{

"users": [

{ "id": 1, ... }, // 1 juta pengguna

{ "id": 2, ... },

...

]

}

// ✅ Lebih Baik: NDJSON (Newline Delimited JSON)

{"id": 1, "name": "Alice"}

{"id": 2, "name": "Bob"}

{"id": 3, "name": "Charlie"}

// Setiap baris dapat diurai secara independen!

2. Gunakan Database Sebagai Gantinya

Untuk dataset yang benar-benar masif:

// Daripada memuat semuanya:

const allData = JSON.parse(hugeFile); // ❌

// Gunakan SQLite, PostgreSQL, atau MongoDB:

const db = new Database('data.db');

db.run('SELECT FROM users WHERE active = 1 LIMIT 100'); // ✅

3. Kompres Data

# Kompres sebelum disajikan

gzip large-file.json

# Menghasilkan pengurangan ukuran 70-90%

# Browser secara otomatis men-dekompresi respons yang di-gzip

4. Gunakan Alat BigJSON untuk Validasi

Sebelum memproses secara programatik, verifikasi file JSON besar Anda:

👉 Coba BigJSON Viewer - Menangani file 100MB+ secara instan di browser Anda!

Fitur:

  • ✅ Pemformatan dan validasi instan
  • ✅ Tampilan pohon interaktif untuk navigasi
  • ✅ Penyalinan path satu-klik untuk debugging
  • ✅ Privasi 100% - semua pemrosesan di sisi klien
  • ✅ Tanpa batasan ukuran file

---

Contoh Kerja Lengkap: Skenario Dunia Nyata

Mari kita urai file log JSON yang besar dan ambil catatan kesalahan (error):

const fs = require('fs');

const JSONStream = require('JSONStream');

const { Transform } = require('stream');

// Utas transform kustom untuk memfilter data

const errorFilter = new Transform({

objectMode: true,

transform(chunk, encoding, callback) {

if (chunk.level === 'error') {

this.push(chunk);

}

callback();

}

});

// Utas output untuk menyimpan hasil

const output = fs.createWriteStream('errors-only.json');

output.write('[\n');

let first = true;

// Pipeline pemrosesan

fs.createReadStream('server-logs.json')

.pipe(JSONStream.parse('logs.')) // Mengurai array 'logs'

.pipe(errorFilter)

.on('data', (errorLog) => {

// Tulis setiap error ke file output

if (!first) output.write(',\n');

output.write(JSON.stringify(errorLog, null, 2));

first = false;

// Juga catat ke konsol

console.log(Kesalahan ditemukan: ${errorLog.message});

})

.on('end', () => {

output.write('\n]');

output.end();

console.log('Pemrosesan selesai!');

});

---

Pemecahan Masalah Umum

"JavaScript heap out of memory"

Solusi:
# Tingkatkan ukuran heap Node.js

node --max-old-space-size=4096 script-anda.js

# Atau gunakan streaming (pendekatan yang lebih baik)

"Browser tab crashed"

Solusi:
  • Gunakan Web Workers
  • Proses dalam bagian yang lebih kecil (chunks)
  • Tambahkan jeda await antar bagian agar browser bisa "bernapas"
  • ---

    Kesimpulan

    Mengurai file JSON besar tidak harus menjadi sakit kepala. Kuncinya adalah memilih pendekatan yang tepat:

    • Sisi Server (Node.js): Gunakan streaming dengan JSONStream atau stream-json
    • Browser: Gunakan membaca per bagian (chunked reading) dengan FileReader atau Web Workers
    • Python: Gunakan ijson untuk pemrosesan yang efisien memori
    • API: Implementasikan paginasi untuk menghindari pemuatan sekaligus

    Tips pro: Sebelum menulis kode, validasi file JSON besar Anda menggunakan BigJSON Viewer untuk memastikan formatnya sudah benar!
    Share:

    Artikel Terkait

    Read in English