Mengapa koma di ujung merusak JSON
Intinya: Koma di ujung legal dalam objek literal JavaScript tetapi fatal dalam JSON. Inilah error persisnya, tata bahasa RFC 8259 yang menyebabkannya, dan tiga perbaikan yang benar-benar bertahan.

Intinya: JSON melarang koma di ujung di mana pun — ketika parser gagal, hapus koma terakhir dengan formatter; gunakan JSON5 atau JSONC hanya untuk parsing lokal yang longgar, dan selalu hasilkan JSON standar untuk sistem lain.
Karena tata bahasanya mengatakan demikian.
{
"name": "demo",
"size": 12,
}
JSON.parse melempar Unexpected token } in JSON at position 34. Node menyebutnya berbeda, tetapi setiap engine menunjuk tempat yang sama: koma sebelum }.
Apa yang sebenarnya dikeluhkan parser
Produksi objek dalam RFC 8259 adalah:
object = begin-object [ member *( value-separator member ) ] end-object
Kurung siku berarti opsional, tanda bintang berarti nol atau lebih. Dengan kata sederhana: koma memisahkan anggota, dan anggota terakhir diikuti langsung oleh }.
Jadi setelah koma, parser siap untuk nama anggota berikutnya. Ia membaca } dan gagal. Array berperilaku identik — [1, 2, 3,] gagal pada ].
Dari mana kebiasaan itu berasal
Objek literal JavaScript telah mengizinkan koma di ujung sejak ES5, demikian juga daftar Python dan literal komposit Go. Editor menambahkannya secara otomatis. Lalu seseorang menyalin objek literal dari berkas .js ke berkas .json dan berkasnya berhenti bisa di-parse.
Sumber umum lainnya adalah JSON yang dibangun dengan tangan: loop yang berjalan dengan i <= length meninggalkan koma setelah elemen terakhir.
Tiga perbaikan
Hapus koma. Baik untuk pengeditan manual. Tempel ke formatter JSON dan error dilaporkan dengan baris serta kolom, sehingga Anda dapat melihat persis koma mana yang harus dihapus.
Parse sebagai JSON5. Superset menerima koma di ujung, yang baik untuk konfigurasi lokal. Itu tidak baik untuk apa pun yang Anda kirim ke sistem lain — penerima tetap akan menolaknya.
Berhenti merangkai string. Gunakan JSON.stringify, json.dumps, Jackson. Serializer menangani pemisah dengan benar sekaligus menyelesaikan escaping.
Daftar audit singkat
| Di mana | Penyebab tipikal |
|---|---|
| Perangkaian dalam loop | i <= length meninggalkan satu koma ekstra |
| Salin-tempel | Objek literal diambil dari berkas JS |
| Template | Koma hardcode plus loop yang menambahkan koma lain |
| Pengeditan manual | Field terakhir dihapus, komanya tertinggal |
FAQ
Mengapa koma di ujung legal di JavaScript tetapi tidak di JSON?
Objek literal JavaScript telah mengizinkannya sejak ES5, demikian juga daftar Python dan literal komposit Go, itulah sebabnya kebiasaan itu terbawa orang ke JSON. RFC 8259 hanya mengizinkan koma di antara anggota: anggota terakhir diikuti langsung oleh } atau ]. Menyalin objek literal dari berkas .js ke berkas .json adalah sumber yang biasa.
Haruskah saya melakukan parsing sebagai JSON5 untuk menerima koma di ujung?
Hanya untuk konfigurasi lokal. Superset menerima koma di ujung, tetapi apa pun yang Anda kirim ke sistem lain di-parse sebagai JSON ketat dan tetap akan gagal. Hasilkan JSON standar di batas output alih-alih mengandalkan penerima bersifat longgar.
Ke mana pertama-tama saya harus melihat setelah error koma di ujung?
Mulai dari posisi dalam pesan error: biasanya ia menunjuk koma sebelum } atau ]. Lalu periksa tiga sumber umum: loop yang ditulis dengan i <= length, objek literal yang ditempel dari berkas JS, dan template yang menghardcode koma bersama sebuah loop. Menempel ke formatter melaporkan baris dan kolom persisnya.