
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
- 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. - 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. - Key tanpa tanda kutip.
{a: 1}— sekali lagi, valid di JS, tidak valid di JSON. Setiap key harus dikutip. - 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. - Double-encoding. Kamu memanggil
JSON.stringify()dua kali, atau kamu sedang mem-parse string yang sebenarnya sudah berupa object — cek dulu dengantypeof raw === 'string'sebelum memanggil.parse(). - Response kosong atau
undefined. Kalau fetch gagal diam-diam atau mengembalikan body kosong,JSON.parse("")melemparUnexpected end of JSON input, error yang berbeda tapi terkait — cekresponse.okdan log body mentahnya sebelum di-parse. - 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.