🐛

Kesalahan JSON umum dan cara memperbaikinya

Panduan lapangan untuk kesalahan JSON yang benar-benar akan Anda temui di alam liar - apa artinya, dari mana asalnya, dan cara memperbaikinya dengan cepat.

· 7menit baca

Kalau Anda cukup lama bekerja dengan JSON, pesan kesalahannya akan hafal sendiri. “Unexpected token in JSON at position 47” — kita semua pernah menatap layar jam 3 pagi dengan pesan itu, mencoba mengirim rilis. Pesannya secara teknis benar tapi hampir tidak pernah membantu: posisi yang disebutkan jarang berada di tempat kesalahan sebenarnya.

Ini adalah panduan lapangan untuk kesalahan JSON yang benar-benar akan Anda temui, apa artinya, dan cara memperbaikinya dengan cepat. Semua contoh diuji terhadap implementasi JSON.parse() standar yang digunakan oleh setiap browser dan Node.js.

1. “Unexpected token , in JSON”

Apa artinya biasanya: trailing comma.

{
 "name": "Alice",
 "role": "admin",
}

Koma setelah "admin" tidak valid. JSON tidak mengizinkan trailing comma, tidak seperti object JavaScript atau dict Python.

Perbaikan: hapus trailing comma.

Sumber: paling sering berasal dari manusia yang mengedit JSON dengan tangan, atau dari alat yang mengekspor literal object bergaya JavaScript dan menyebutnya JSON.

Jebakan terkait: parser biasanya menunjuk pada baris setelah koma, bukan pada koma itu sendiri. Jadi jika kesalahan mengatakan “baris 5” lihat baris 4 terlebih dahulu.

2. “Unexpected end of JSON input”

Apa artinya biasanya: file terpotong. Closing bracket atau brace hilang.

{
 "users": [
 { "name": "Alice" },
 { "name": "Bob" }
 ]
 closing brace hilang untuk outer object

Perbaikan: hitung bracket Anda. Sebagian besar editor menunjukkan bracket matching - letakkan kursor Anda pada { pembuka dan lihat apa pasangannya.

Sumber: unduhan HTTP yang gagal (koneksi terputus sebelum respons lengkap tiba), penulisan yang tidak lengkap dari proses yang crash, kerusakan file.

Diagnostik: periksa ukuran file. Jika Anda mengharapkan 200 KB dan mendapatkan 180 KB, file terpotong - kembali ke sumber.

3. “Unexpected token } in JSON”

Apa artinya biasanya: closing brace ekstra, atau koma yang hilang sebelum key saudara.

{
 "name": "Alice" koma yang hilang di sini
 "role": "admin"
}

Perbaikan: tambahkan koma yang hilang.

Atau:

{ "name": "Alice" } } ← closing brace ekstra

Perbaikan: hapus brace ekstra.

4. “Unexpected token u in JSON”

Apa artinya biasanya: secara harfiah karakter u muncul di tempat nilai diharapkan. Paling umum ini adalah string undefined, yang bukan JSON yang valid.

{ "role": undefined }

undefined adalah nilai JavaScript, bukan nilai JSON. JSON hanya memiliki null.

Perbaikan: ganti undefined dengan null, atau abaikan key sepenuhnya.

Sumber: kode yang melakukan JSON.stringify() pada object dengan nilai undefined - kecuali stringify sebenarnya menanganinya dengan benar. Kesalahan kemungkinan besar dari pengeditan manual atau dari serializer non-standar.

5. “Unexpected token < in JSON”

Apa artinya biasanya: “JSON” Anda sebenarnya adalah HTML. < adalah awal dari tag HTML.

<!DOCTYPE html>
<html>
 <head><title>500 Server Error</title>
 ...

Perbaikan: periksa apa yang sebenarnya dikembalikan server Anda. Ini mungkin adalah halaman kesalahan (sering HTML) daripada respons JSON yang Anda harapkan.

Sumber: endpoint yang salah dikonfigurasi, kegagalan autentikasi yang mengalihkan ke halaman login, server mengembalikan halaman kesalahan alih-alih body kesalahan JSON.

Diagnostik: console.log(response.text) (atau yang setara) sebelum parsing. Jika Anda melihat HTML, masalah Anda ada di sisi server, bukan pada parsing JSON Anda.

6. “Unexpected token ’ in JSON”

Apa artinya biasanya: kutip tunggal alih-alih kutip ganda.

{ 'name': 'Alice' }

String JSON harus dikutip ganda. String yang dikutip tunggal adalah JSON yang tidak valid, meskipun berfungsi di JavaScript dan Python.

Perbaikan: ganti semua kutip tunggal dengan kutip ganda. Jika string berisi kutip ganda literal, escape mereka (\").

Sumber: menempelkan literal object JavaScript dan menyebutnya JSON; output dict Python yang tidak diserialisasi melalui json.dumps().

7. “Unexpected token n in JSON”

Apa artinya biasanya: NaN atau null yang nyasar ditulis di mana angka diharapkan - atau lebih halus, baris baru literal di dalam string.

{ "description": "hello
world" }

String JSON tidak bisa berisi baris baru literal. Baris baru harus di-escape sebagai \n.

Perbaikan: escape baris baru:

{ "description": "hello\nworld" }

Sumber: membangun JSON secara manual dari input multi-baris, atau dari sistem yang membuang field teks secara langsung tanpa escaping.

8. “Unexpected number in JSON”

Apa artinya biasanya: angka dalam format tidak valid.

Angka tidak valid yang umum:

  • +5 (tanda plus di depan - tidak diizinkan)
  • 07 (nol di depan pada integer - tidak diizinkan)
  • 1. (titik desimal tanpa digit berikutnya)
  • .5 (titik di depan tanpa nol)
  • Infinity, -Infinity, NaN (angka khusus - tidak diizinkan)

Perbaikan:

  • Hapus + di depan: +55
  • Jatuhkan nol di depan: 077
  • Tambahkan nol yang hilang: 1.1.0, .50.5
  • Ganti Infinity/NaN dengan null atau string sentinel: "Infinity" atau null

Sumber: menserialisasi matematika floating-point yang menghasilkan Infinity, mengekspor data numerik dari sistem dengan konvensi berbeda.

9. “Duplicate key ’…’ in JSON”

Apa artinya biasanya: object memiliki key yang sama dua kali.

{
 "name": "Alice",
 "name": "Bob"
}

Parser standar secara teknis menerima ini - mereka secara diam-diam mengambil nilai terakhir. Parser ketat menolaknya. Jika parser Anda menandai duplikat sebagai kesalahan, ia melakukan kebaikan bagi Anda.

Perbaikan: putuskan nilai mana yang benar dan hapus yang lain. Selalu.

Sumber: penggabungan data yang tidak melakukan deduplikasi dengan benar, edit tangan yang memperkenalkan ulang key tanpa menghapus yang lama.

10. “Expected ’:’ after property name in JSON”

Apa artinya biasanya: Anda menggunakan = alih-alih :, atau melupakan titik dua sepenuhnya.

{ "name" = "Alice" } ← salah (= alih-alih :)
{ "name" "Alice" } ← salah (tidak ada titik dua)

Perbaikan: gunakan titik dua.

Sumber: memori otot dari bahasa lain (misalnya = di YAML atau TOML).

11. UTF-8 atau BOM tidak valid

Apa artinya biasanya: file dimulai dengan BOM (byte-order mark) atau berisi byte UTF-8 yang tidak valid.

BOM (U+FEFF) adalah penanda file-encoding Windows legacy. Parser JSON secara teknis harus menolaknya, meskipun banyak yang mentoleransinya secara diam-diam.

Perbaikan: hapus BOM. Pada macOS/Linux: tail -c +4 file.json > file-clean.json (menjatuhkan 3 byte BOM). Pada Windows: simpan file sebagai “UTF-8 without BOM” di editor Anda.

Sumber: Windows Notepad menyimpan file JSON, produk Microsoft mengekspor teks, ekspor CMS yang lebih lama.

12. Kesalahan “Circular structure” dari JSON.stringify

Secara ketat, ini adalah kesalahan serialisasi, bukan kesalahan parse, tetapi cukup sering muncul untuk disebutkan.

const obj = { a: 1 }
obj.self = obj
JSON.stringify(obj) // TypeError: Converting circular structure to JSON

Perbaikan: jangan meneruskan struktur yang mengacu pada diri sendiri ke stringify. Entah ratakan data sebelum serialisasi, atau gunakan pustaka seperti flatted atau safe-stringify yang menangani siklus secara eksplisit.

Sumber: komponen React, node DOM, model ORM dengan back-reference.

Alur kerja debugging

Saat menghadapi kesalahan parse JSON, lakukan ini secara berurutan:

  1. Salin JSON yang bermasalah ke formatter
  2. Klik Format — kalau ditolak, Anda akan tahu di mana
  3. Lihat 2-3 baris di atas baris yang dilaporkan; kesalahan sebenarnya sering lebih awal dari yang ditunjuk
  4. Perhatikan tersangka utama — trailing comma, koma yang hilang, kutip tunggal, string yang tidak ditutup
  5. Kalau filenya besar, gunakan pendekatan bagi dua: hapus paruh kedua dokumen dan coba lagi. Kalau valid, kesalahannya ada di paruh yang dihapus. Persempit terus.
  6. Periksa sumbernya — apakah API Anda benar-benar mengembalikan JSON, atau HTML / teks biasa?

Kebiasaan yang mencegah masalah sebelum muncul

Validasi JSON sebelum commit ke version control. Pre-commit hook yang menjalankan jq empty file.json menangkap sebagian besar masalah. Gunakan linter (ESLint, Prettier) yang memahami JSON dan menandai masalah saat save.

Pilih pustaka serialisasi (JSON.stringify, json.dumps) daripada membangun string JSON secara manual. Konstruksi manual adalah asal muasal trailing comma, key tanpa kutip, dan string yang tidak di-escape. Gunakan JSON schema untuk dokumen penting agar masalah struktur — bukan hanya sintaks — tertangkap sebelum deployment. Dan jaga agar tipe nilai konsisten: jangan campur "1" (string) dan 1 (number) untuk field yang sama di seluruh record, karena suatu saat pasti ada yang tersandung di hilir.

Dua menit di formatter

Sebagian besar kesalahan dalam daftar ini bisa ditemukan dalam hitungan detik dengan JSON Formatter kami. Tempel JSON yang rusak, klik Format, baca pesan kesalahannya. Semua berjalan di browser, jadi konfigurasi sensitif atau respons API tidak pergi ke mana-mana.

JSON sederhana berdasarkan desainnya, artinya kesalahannya pun sederhana — tapi tetap menjengkelkan di tengah tekanan. Dua menit di formatter biasanya cukup untuk menemukan masalahnya dan membuat Anda kembali fokus ke hal yang sebenarnya.