[Alat Developer]•Baca 6 menit
Lima Penyebab JSON Gagal Di-parse dan Jebakan Angka Besar
1. JSON lebih ketat daripada kelihatannya
JSON mirip literal objek JavaScript, tetapi jauh lebih terbatas. JSON didefinisikan oleh RFC 8259 dan ECMA-404, dan banyak hal yang valid di JavaScript ternyata tidak valid di JSON.
2. Lima penyebab parsing gagal
① Koma di akhir
{"a": 1, "b": 2,} — koma setelah anggota terakhir adalah kesalahan. JavaScript mengizinkannya; JSON tidak.② Kunci tanpa tanda kutip
{a: 1} — kunci harus berupa string dengan tanda kutip ganda.③ Tanda kutip tunggal
{'a': 'b'} — JSON hanya mengenali tanda kutip ganda.④ Komentar
Baik
// catatan maupun /* */ tidak ada di JSON standar. File konfigurasi yang membutuhkan komentar harus memakai ekstensi seperti JSONC atau JSON5.⑤ Nilai khusus
NaN, Infinity, dan undefined bukan JSON. Nyatakan angka yang tidak ada sebagai null atau sebagai string.Kesalahan umum lainnya adalah baris baru mentah di dalam string; karakter itu harus di-escape menjadi
\n.3. Membaca posisi kesalahan
Parser biasanya melaporkan sesuatu seperti "position 42", tetapi penyebab sebenarnya sering berada lebih awal. Satu tanda kutip yang hilang membuat parser menelan sisa dokumen sebagai bagian dari string sampai akhirnya gagal jauh di belakang.
Menjalankan dokumen melalui formatter untuk menjabarkan strukturnya membuat susunan bersarang yang tidak cocok mudah terlihat.
4. Jebakan angka besar
Ini bukan kesalahan sintaks, melainkan perubahan nilai secara diam-diam, sehingga justru lebih berbahaya.
Angka di JavaScript adalah floating point presisi ganda, jadi bilangan bulat hanya bisa direpresentasikan secara tepat sampai:
Number.MAX_SAFE_INTEGER = 9007199254740991Mem-parse bilangan bulat yang lebih besar dengan
JSON.parse akan mengubah nilainya diam-diam. Misalnya 12345678901234567890 menjadi 12345678901234567000, tanpa error dan tanpa peringatan.Kapan ini menjadi masalah
Solusinya
Solusi standarnya adalah server menserialisasi nilai tersebut sebagai string:
{"id": "12345678901234567890"}. Jika klien harus memperlakukannya sebagai angka, gunakan BigInt dengan reviver khusus.5. Varian JSON
| Format | Perbedaan | Digunakan untuk |
|---|---|---|
| JSON | Standar | Respons API, pertukaran data |
| JSONC | Boleh berisi komentar | Pengaturan VS Code dan sejenisnya |
| JSON5 | Komentar, koma di akhir, tanda kutip tunggal | File konfigurasi yang ditulis manual |
| NDJSON / JSON Lines | Satu nilai JSON per baris | Log, streaming, pemrosesan massal |
Jangan mengembalikan JSONC dari API hanya karena berfungsi di file konfigurasi; parser standar akan menolaknya.
6. Catatan keamanan
Kode yang menjalankan string JSON lewat
eval() sesekali masih ditemukan. Jangan pernah melakukannya. Input yang tidak tepercaya dan berisi kode akan dieksekusi sebagai kode. JSON.parse aman.7. Alat
Pemformat JSON EVEDAYS memvalidasi dan merapikan JSON di dalam browser Anda. Respons API sering berisi data pribadi atau token, jadi alat yang tidak pernah mengirimkannya ke mana pun adalah pilihan yang lebih aman.