Skip to content
jsonforge.app
Kembali ke blog
Panduan7 menit baca

Error Parsing JSON yang Umum dan Cara Memperbaikinya

JSON.parse() tidak mengurai sebagian dan tidak menebak maksud Anda. Satu karakter salah tempat dalam dokumen multi-megabyte memunculkan SyntaxError generik yang sama dengan satu karakter salah tempat dalam berkas konfigurasi lima baris. Panduan ini membahas error yang akan Anda temui di V8 (Node.js dan Chrome), maksud masing-masing, dan cara memilih antara memperbaiki manual atau memakai alat repair otomatis.

Mengapa JSON.parse melempar error alih-alih menebak

Object literal JavaScript itu pemaaf: key tanpa kutip, trailing comma, string berkutip tunggal, dan komentar semuanya legal, karena engine mengurai kode itu seperti kode lainnya. JSON adalah tata bahasa yang jauh lebih kecil dan ketat (RFC 8259), dan JSON.parse() menegakkan setiap aturannya tanpa fallback. Parser membaca dari kiri ke kanan dan berhenti pada token pertama yang tidak sesuai tata bahasa di posisi itu.

Perancang JSON memilih ini dengan sengaja. Parser JSON yang longgar akan menerima dokumen yang sedikit berbeda di tiap implementasi, dan masalah interoperabilitas itulah yang ingin dihindari JSON. Konsekuensinya, pesan error singkat dan hanya menunjuk posisi. Parser memberi tahu di mana tata bahasa rusak, bukan apa yang ingin Anda tulis.

Trailing comma

Error JSON paling umum adalah trailing comma yang tersisa dari mengedit object literal JavaScript (yang legal) dan lupa bahwa hal itu tidak legal di JSON.

Koma setelah entri terakhir array/object adalah JSON tidak valid.
json
{
  "name": "Alice",
  "roles": ["admin", "editor"],
}

V8 menolak ini pada closing brace, bukan pada komanya, karena koma itu sendiri adalah tata bahasa yang valid sampai parser mengharapkan property lain dan menemukan `}`. Tergantung versi Node/Chrome Anda, akan muncul sesuatu seperti `Unexpected token '}', "...editor"],\n}"... is not valid JSON` (V8 lebih baru, dengan cuplikan) atau yang lama dan lebih ringkas `Unexpected token } in JSON at position 47`. Bagaimanapun, perbaikannya sama: hapus koma sebelum kurung penutup.

Kutip tunggal dan key tanpa kutip

JSON mewajibkan kutip ganda untuk setiap string dan setiap key, tanpa kecuali. String berkutip tunggal dan key telanjang (tanpa kutip) sering muncul saat orang mengetik JSON manual atau menyalinnya dari kode sumber JavaScript.

Keduanya adalah JSON tidak valid, meskipun valid sebagai object literal JS.
json
{ 'name': 'Alice' }
{ name: "Alice" }

Kutip tunggal di awal memunculkan sesuatu seperti `Unexpected token ''', "{ 'name'"... is not valid JSON`. Key tanpa kutip dilaporkan berbeda: V8 modern tahu bahwa ia mengharapkan nama property dan melaporkan `Expected property name or '}' in JSON at position 2` tanpa menyebut identifier telanjangnya. Perbaikannya mekanis: bungkus setiap key dan setiap nilai string dengan kutip ganda.

Newline dan karakter kontrol tanpa escape di dalam string

JSON melarang newline mentah, tab, atau karakter kontrol lain (apa pun di bawah U+0020) di dalam string. Escape karakter itu sebagai `\n`, `\t`, dan seterusnya. Masalah ini paling sering muncul ketika kode membangun JSON dengan menggabungkan nilai multi-baris (pesan log, cuplikan kode, komentar pengguna) ke dalam string literal tanpa meng-escape-nya.

Line break literal di dalam nilai string, tidak di-escape.
json
{
  "message": "line one
line two"
}

Ini menghasilkan `SyntaxError: Bad control character in string literal in JSON at position 21`, salah satu dari sedikit error JSON yang menyebut masalahnya, bukan hanya token. Escape karakternya, jangan biarkan mentah: `"line one\nline two"`.

Key duplikat, NaN/Infinity/undefined, dan karakter BOM

Tiga mode kegagalan yang lebih senyap perlu Anda kenali. Pertama, key duplikat dalam object JSON tidak menimbulkan parse error. `{ "id": 1, "id": 2 }` berhasil diurai, dan JSON.parse menyimpan kemunculan terakhir (`id: 2`) serta membuang yang pertama tanpa peringatan. RFC 8259 menyatakan nama 'sebaiknya' unik tetapi tidak mewajibkan parser menolak duplikat, jadi parser Anda sesuai spesifikasi, dan reviewer mudah melewatkan bug ini.

Kedua, `NaN`, `Infinity`, dan `undefined` valid di JavaScript tetapi bukan token JSON. JSON punya `number` tanpa nilai spesial IEEE-754, dan tidak punya `undefined` (hanya `null`). `{ "value": NaN }` melempar `Unexpected token 'N', ..."value":NaN}"... is not valid JSON` (atau `Unexpected token N in JSON at position 10` di engine lama). `JSON.stringify` mengonversi `NaN`/`Infinity` menjadi `null` dan membuang nilai `undefined`, jadi error ini biasanya berarti seseorang menulis JSON itu dengan tangan atau sumber non-JS mengasumsikan semantik JS.

Ketiga, byte-order-mark UTF-8 (U+FEFF) di awal berkas merusak `JSON.parse` saat Anda membaca berkas sebagai string mentah, dan memunculkan `Unexpected token '\ufeff'... is not valid JSON` di posisi 0. Editor Windows dan sebagian alat Java/.NET menambahkannya saat menyimpan UTF-8. Masalah ini khusus untuk `JSON.parse` pada string: `Response.json()` di Fetch API mendekode teks UTF-8 dan membuang BOM di awal saat mendekode, jadi byte yang sama bisa berperilaku berbeda lewat HTTP dan saat dibaca dari disk dengan `fs.readFileSync(path, 'utf8')`.

Membaca posisi, dan kapan memakai alat repair

`position` dalam error JSON.parse adalah offset karakter berindeks nol dalam string yang Anda berikan, bukan nomor baris. Node (v20+) juga menambahkan `(line X column Y)`, tetapi runtime dan peramban lama hanya memberi offset mentah. Dua hal sering menjebak. Posisi itu menandai tempat parser menyadari tata bahasa rusak, dan untuk trailing comma atau kurung yang hilang, tempat itu sering satu token setelah kesalahan Anda. Lalu, jika Anda me-pretty-print JSON agar mudah dibaca padahal sedang men-debug string minified aslinya, offset tidak akan cocok dengan yang tampil di layar.

Untuk satu salah sintaks dalam dokumen pendek, perbaiki manual begitu posisinya ketemu. Tempel ke validator yang menyorot karakternya daripada menghitung offset. Untuk berkas besar dengan beberapa error tak berhubungan, JSON dari alat upstream yang buggy, atau JSON yang rusak karena berkali-kali copy-paste, memperbaiki manual terlalu makan waktu. Saat itulah Anda beralih ke otomatisasi. JSON Validator milik JsonForge menunjukkan setiap pelanggaran schema dengan path yang tepat begitu dokumen bisa diurai, dan JSON Repair memperbaiki kesalahan struktural umum (kutip hilang, trailing comma, kurung tak cocok) ketika masukan terlalu rusak untuk diperbaiki satu per satu.

FAQ

Mengapa JSON.parse gagal pada berkas yang tampak sepenuhnya baik-baik saja?
Penyebab tak terlihat yang paling umum adalah karakter byte-order-mark (BOM) di awal, serta 'smart quotes' atau em-dash yang masuk lewat copy-paste dari pengolah kata, aplikasi chat, atau PDF. Di kebanyakan font keduanya tampak sama dengan kutip ganda biasa atau tanda hubung, tetapi merupakan karakter Unicode berbeda yang ditolak JSON.parse. Buka berkasnya di editor yang bisa menampilkan karakter tersembunyi/non-ASCII, atau bandingkan dengan versi yang diketahui baik.
Mengapa key duplikat tidak dianggap error?
Spesifikasi JSON (RFC 8259) menyatakan nama anggota object 'sebaiknya' unik tetapi tidak mewajibkan parser menegakkannya, jadi setiap implementasi memutuskan sendiri. JSON.parse JavaScript menyimpan duplikat terakhir dan membuang yang lebih awal; parser di beberapa bahasa lain melempar error, dan sebagian menyimpan kemunculan pertama. Jangan mengandalkan perilaku key duplikat yang sama di semua lingkungan.
Bisakah saya membuat JSON.parse menerima trailing comma atau komentar?
JSON.parse sendiri tidak bisa. Ia mengimplementasikan tata bahasa JSON tanpa opsi kelonggaran. Jika Anda butuh komentar atau trailing comma, gunakan parser superset JSON seperti JSON5 atau parser yang paham JSONC, atau buang sintaks bermasalah itu sebelum memanggil JSON.parse. Batasi stripping berbasis regex untuk skrip sekali pakai, karena regex bisa merusak koma atau kurung di dalam nilai string.
Apa cara tercepat menemukan lokasi persis error dalam berkas besar?
Jangan menghitung karakter secara manual. Tempel dokumen ke formatter atau validator yang menyorot baris dan kolom yang bermasalah. Anda menemukannya dalam hitungan detik, dan di berkas besar offset karakter mentah memang tidak berarti apa-apa bagi manusia.

Coba alat ini

Artikel terkait