CodeKitHub
Bahasa Indonesia
Memperbaiki "Unexpected token" di JSON.parse: panduan lengkap untuk setiap penyebab

Memperbaiki "Unexpected token" di JSON.parse: panduan lengkap untuk setiap penyebab

Dipublikasikan 23 Jul 2026

SyntaxError: Unexpected token X in JSON at position N adalah salah satu error paling umum di JavaScript, dan salah satu yang paling kurang membantu — error ini memberi tahu di mana parser menyerah, bukan kenapa. Berikut cara memperbaikinya dengan benar.

Langkah 1: baca angka posisinya

JSON.parse menghitung karakter dari awal string, dimulai dari 0. Kalau JSON kamu berasal dari sebuah variabel, log dulu potongan persis di sekitar posisi tersebut sebelum melakukan apa pun:

try {
  JSON.parse(raw);
} catch (e) {
  const match = e.message.match(/position (\d+)/);
  if (match) {
    const pos = Number(match[1]);
    console.log(raw.slice(Math.max(0, pos - 20), pos + 20));
  }
}

Satu potongan kode ini menyelesaikan lebih banyak error semacam ini daripada saran apa pun soal sintaks JSON, karena kebanyakan error “unexpected token” sebenarnya adalah error “aku tidak tahu isi string-ku yang sebenarnya” — spasi tersisa dari copy-paste, baris baru ekstra dari template literal, atau byte-order-mark (BOM) di paling awal (posisi 0, token , yang tidak terlihat di kebanyakan editor).

7 penyebab, diurutkan dari yang paling sering terjadi

  1. Koma di akhir (trailing comma). {"a": 1, "b": 2,} — valid di object literal JS, tapi tidak valid di JSON. Koma sebelum } atau ] adalah penyebab paling umum.
  2. Tanda kutip tunggal, bukan tanda kutip ganda. {'a': 1} itu JS, bukan JSON. JSON mewajibkan tanda kutip ganda untuk key maupun nilai string, tanpa pengecualian.
  3. Key tanpa tanda kutip. {a: 1} — sekali lagi, valid di JS, tidak valid di JSON. Setiap key harus dikutip.
  4. Nilai JS yang bukan JSON valid. undefined, NaN, sebuah fungsi, atau komentar (// seperti ini) — semua ini tidak ada di spesifikasi JSON, hanya ada di JavaScript.
  5. Double-encoding. Kamu memanggil JSON.stringify() dua kali, atau kamu sedang mem-parse string yang sebenarnya sudah berupa object — cek dulu dengan typeof raw === 'string' sebelum memanggil .parse().
  6. Response kosong atau undefined. Kalau fetch gagal diam-diam atau mengembalikan body kosong, JSON.parse("") melempar Unexpected end of JSON input, error yang berbeda tapi terkait — cek response.ok dan log body mentahnya sebelum di-parse.
  7. BOM atau karakter tak terlihat dari hasil copy-paste. Menempel JSON dari PDF, dokumen Word, atau output terminal tertentu bisa membawa BOM atau spasi non-breaking yang terlihat identik dengan karakter normal.

Cara tercepat memperbaiki: validasi dulu sebelum debug

Membaca pesan error mentah karakter demi karakter itu lambat. Tempelkan string persisnya ke formatter yang menyorot langsung karakter yang tidak valid, alih-alih menebak-nebak dari angka posisi — ini mengubah “sekitar karakter ke-812” menjadi “kurung tutup yang hilang, persis di sini.” (Tautannya di bawah.)

Kalau JSON-nya benar-benar valid tapi tetap gagal

Kalau formatter mengonfirmasi bahwa JSON kamu sudah benar secara sintaks tapi JSON.parse masih melempar error, berarti string yang kamu masukkan bukan string yang kamu kira. Penyebab paling umum: kamu memanggil .parse() pada objek Response, bukan pada body yang sudah di-resolve.

// Salah — mem-parse "[object Response]", bukan body-nya
const data = JSON.parse(await fetch(url));

// Benar
const data = await (await fetch(url)).json();
// atau, kalau kamu butuh teks mentahnya dulu:
const text = await (await fetch(url)).text();
const data = JSON.parse(text);

Referensi cepat

Gejala Kemungkinan penyebab
Unexpected token } Koma tersisa sebelum kurung kurawal penutup
Unexpected token ' Tanda kutip tunggal dipakai alih-alih tanda kutip ganda
Unexpected token a (atau huruf apa pun) Key object tanpa tanda kutip
Unexpected end of JSON input String kosong, response terpotong, atau kurung yang belum ditutup
Unexpected token  (posisi 0) Byte-order-mark dari file hasil copy-paste atau yang disimpan di Windows

Tidak ada satu pun dari ini yang perlu dihafalkan — perbaikannya selalu tiga langkah yang sama: log potongan di sekitar posisi yang dilaporkan, jalankan lewat formatter, perbaiki satu karakter yang ditandai.

← Kembali ke Blog