Mengapa koma mengekor merosakkan JSON
Inti pati: Koma mengekor sah dalam literal objek JavaScript dan membawa maut dalam JSON. Berikut ialah ralat tepat, tatabahasa RFC 8259 yang menyebabkannya, dan tiga pembetulan yang benar-benar berkesan.

Pokoknya: JSON melarang koma mengekor di mana-mana — apabila penghurai gagal, padam koma terakhir dengan pemformat; gunakan JSON5 atau JSONC hanya untuk penghuraian longgar setempat, dan sentiasa keluarkan JSON standard kepada sistem lain.
Kerana tatabahasa mengatakannya.
{
"name": "demo",
"size": 12,
}
JSON.parse melontar Unexpected token } in JSON at position 34. Node menyebutnya dengan cara berbeza, tetapi setiap enjin menunjuk ke tempat yang sama: koma sebelum }.
Apa yang sebenarnya diadukan oleh penghurai
Pengeluaran objek dalam RFC 8259 ialah:
object = begin-object [ member *( value-separator member ) ] end-object
Kurungan siku bermaksud pilihan, asterisk bermaksud sifar atau lebih. Dalam istilah mudah: koma memisahkan ahli, dan ahli terakhir diikuti terus oleh }.
Jadi selepas koma penghurai bersedia untuk nama ahli lain. Ia membaca } dan gagal. Tatasusunan berkelakuan sama — [1, 2, 3,] gagal pada ].
Dari mana tabiat itu datang
Literal objek JavaScript telah membenarkan koma mengekor sejak ES5, begitu juga senarai Python dan literal komposit Go. Editor menambahnya secara automatik. Kemudian seseorang menyalin literal objek daripada fail .js ke dalam fail .json dan fail itu berhenti dihuraikan.
Sumber biasa yang lain ialah JSON yang dibina dengan tangan: gelung yang berjalan i <= length meninggalkan koma selepas elemen terakhir.
Tiga pembetulan
Buang koma. Baik untuk suntingan manual. Tampal ke dalam pemformat JSON dan ralat dilaporkan dengan baris dan lajur, jadi anda boleh melihat dengan tepat koma mana yang perlu dipadam.
Huraikan sebagai JSON5. Superset menerima koma mengekor, yang baik untuk konfigurasi setempat. Ia tidak baik untuk apa-apa yang anda hantar ke sistem lain — penerima masih akan menolaknya.
Berhenti menggabungkan rentetan. Gunakan JSON.stringify, json.dumps, Jackson. Pensirian mengendalikan pemisah dengan betul dan menyelesaikan escape pada masa yang sama.
Senarai semakan pantas
| Di mana | Punca biasa |
|---|---|
| Gabungan gelung | i <= length meninggalkan satu koma tambahan |
| Salin tampal | Literal objek diambil daripada fail JS |
| Templat | Koma dikodkan keras serta gelung yang menambah satu lagi |
| Suntingan manual | Medan terakhir dipadam, komanya tertinggal |
Soalan Lazim
Mengapa koma mengekor sah dalam JavaScript tetapi tidak dalam JSON?
Literal objek JavaScript telah membenarkannya sejak ES5, begitu juga senarai Python dan literal komposit Go, sebab itulah tabiat itu mengikuti orang ke dalam JSON. RFC 8259 membenarkan koma hanya antara ahli: ahli terakhir diikuti terus oleh } atau ]. Menyalin literal objek daripada fail .js ke dalam fail .json ialah sumber biasa.
Patutkah saya menghuraikan sebagai JSON5 untuk menerima koma mengekor?
Hanya untuk konfigurasi setempat. Superset menerima koma mengekor, tetapi apa-apa yang anda hantar ke sistem lain dihuraikan sebagai JSON ketat dan masih akan gagal. Jana JSON standard pada sempadan output dan bukannya bergantung pada penerima bersikap longgar.
Di mana saya patut melihat dahulu selepas ralat koma mengekor?
Mulakan dengan kedudukan dalam mesej ralat: ia biasanya menunjuk kepada koma sebelum } atau ]. Kemudian semak tiga sumber biasa: gelung yang ditulis dengan i <= length, literal objek yang ditampal daripada fail JS, dan templat yang mengkodkan keras koma bersama gelung. Menampal ke dalam pemformat melaporkan baris dan lajur yang tepat.