Alat pembangun · JSON pemformat & pengesah
JavaScript literal objek lwn JSON: mengapa petikan tunggal gagal pengesahan
· Bagaimana ia berfungsi
json aliran kerja pembangun pengesahan
Objek yang dicetak oleh konsol JavaScript kelihatan seperti JSON tetapi biasanya tidak. Siaran ini menyenaraikan perbezaan yang tepat (petikan, kunci tidak disebut, tidak ditentukan, fungsi) dan menunjukkan di mana setiap satu mengesah pengesah.
Ia keluar dari konsol, jadi mengapa ia tidak sah?
Ia keluar dari konsol, jadi mengapa ia tidak sah? — konsol pembangun memaparkan nilai JavaScript sebagai JavaScript teks seperti sumber, bukan sebagai siri JSON yang dijamin. Objek yang disalin mungkin mengandungi nama harta kosong, rentetan petikan tunggal, `undefined` atau anotasi khusus pelayar. Semua itu boleh difahami oleh enjin JavaScript atau pembaca manusia semasa gagal serta-merta dalam fail `.json`, yang tatabahasanya sengaja lebih kecil dan bebas daripada kod boleh laku.
Pertimbangkan `{name: "Ada", active: true, missing: undefined}`. Tanda kurung, titik bertindih dan boolean menyerupai JSON, tetapi kunci kosong pertama sudah melanggar peraturan ahli objek dan `undefined` akan gagal kemudian. ToolAcre melaporkan aksara atau nilai pertama yang tidak disokong dengan baris dan lajur, jadi penukaran sebaiknya dilakukan mengikut tertib.
Rentetan mesti menggunakan petikan berganda
Rentetan mesti menggunakan petikan berganda — JSON mentakrifkan rentetan sebagai aksara yang dilampirkan oleh `"`, dengan garis serong ke belakang pelepasan aksara jika diperlukan. Petikan tunggal tidak mempunyai peranan sebagai pembatas rentetan. Apabila pengesah bertemu `'Ada'`, ia tidak memulakan rentetan dan kemudian membantah kandungannya; ia menolak apostrof pembukaan itu sendiri. Ini terpakai sama pada nama sifat dan nilai rentetan, walaupun JavaScript membenarkan sama ada gaya petikan untuk literalnya sendiri.
Menukar petikan memerlukan lebih berhati-hati daripada menggantikan setiap apostrof secara global. Tanda kutip di dalam teks seperti `Ada's profile` ialah kandungan biasa apabila nilainya disebut dua kali, manakala petikan berganda sedia ada di dalam kandungan itu mesti dilepaskan. Borang JSON yang sah ialah `"Ada's "profile""`.
Kunci mesti dipetik rentetan
Kunci mesti dipetik rentetan — JavaScript literal objek membenarkan nama gaya pengecam seperti `{name: 1}` dan nama yang dikira seperti `{[expression]: 1}`. JSON tidak membenarkan kedua-dua trengkas. Selepas tanda kurung atau koma pembukaan, ahli seterusnya mesti bermula dengan rentetan petikan dua, diikuti dengan titik bertindih. Perwakilan yang sah ialah `{"name": 1}`. Pengesah yang menunjuk pada `n` sedang mengenal pasti tempat yang tepat di mana petikan diperlukan.
Memetik setiap kunci juga menghilangkan kesamaran di sekitar ruang, tanda sempang dan perkataan terpelihara. JavaScript mungkin memerlukan sintaks sumber yang berbeza untuk kes tersebut, tetapi JSON menggunakan satu peraturan yang konsisten: `"display-name"`, `"first name"` dan `"default"` semuanya adalah nama ahli biasa. Kekunci yang kelihatan angka adalah rentetan juga.
Nilai JSON tidak ada
Nilai JSON sahaja tidak mempunyai — perbendaharaan kata nilainya ialah objek, tatasusunan, rentetan, nombor, `true`, `false` dan `null`. Tiada `undefined`, `NaN`, `Infinity`, fungsi, ungkapan biasa, BigInt atau Date literal. Komen tiada dalam tatabahasa dan nombor tidak boleh menggunakan heksadesimal, binari, tanda tambah terkemuka atau JavaScript pemisah angka. Setiap binaan yang dipinjam akhirnya mencapai aksara yang tidak boleh memulakan atau meneruskan nilai JSON yang sah.
Penukaran memerlukan keputusan data dan bukannya helah ejaan. Gantikan `undefined` dengan `null` sahaja jika nilai kosong yang jelas sepadan dengan kontrak permohonan; sebaliknya keluarkan ahli atau bekalkan nilai sebenar. Kodkan tarikh sebagai rentetan yang dipersetujui, selalunya ISO 8601. Mewakili nombor tidak terhingga mengikut API yang menerima dan bukannya mencipta token JSON.
Contoh yang berjaya: menukar tempat pembuangan konsol menjadi JSON yang sah
Contoh yang berjaya: menukar tempat pembuangan konsol menjadi JSON yang sah — mulakan dengan `{name: 'Ada', active: true, score: NaN, updated: new Date()}`. Petikan `name`, `active`, `score` dan `updated` dengan petikan berganda. Tukar nilai nama kepada rentetan petikan dua kali. Tentukan bahawa skor yang tidak tersedia hendaklah `null` dan gantikan ungkapan pembina dengan rentetan cap masa sebenar yang dimaksudkan untuk dihasilkan. Dokumen itu kini sahaja mengandungi JSON ahli dan nilai.
Bentuk siap mungkin `{"name":"Ada","active":true,"score":null,"updated":"2026-03-21T10:00:00Z"}`. Sahkan selepas setiap kategori pembaikan kerana ralat pertama boleh menyembunyikan sintaks JavaScript sahaja kemudian. Memformat hasil yang diterima kemudian mendedahkan strukturnya tanpa melakukan sebarang penukaran selanjutnya.
Perangkap terbalik — sah JSON yang JavaScript akan dibaca secara berbeza, seperti integer yang sangat besar dan kekunci __proto__
Perangkap terbalik — JSON yang sah masih boleh memperoleh gelagat atau pengehadan khusus JavaScript selepas menghuraikan. JSON nombor tidak mempunyai had ketepatan terbina dalam dalam tatabahasa, tetapi JSON.parse menghasilkan JavaScript nilai Nombor. Oleh itu, integer di luar julat selamat boleh dibundarkan secara senyap. Jika setiap digit penting, kodkan pengecam sebagai rentetan atau gunakan penghurai dan jenis data yang direka untuk mengekalkan nombor ketepatan arbitrari dan bukannya mempercayai semakan sintaks yang berjaya.
Nama ahli `"__proto__"` juga sah JSON dan JSON.parse menciptanya sebagai sifat data sendiri. Masalah boleh bermula kemudian jika kod aplikasi menyalin sifat yang dihuraikan ke objek lain dengan tugasan yang tidak selamat atau gelagat gabungan. Pengesahan membuktikan bahawa teks mengikut tatabahasa JSON; ia tidak membuktikan bahawa setiap kunci adalah selamat untuk setiap pengguna.
Perkara ini tidak meliputi
Perkara ini tidak meliputi — JSON5, JSONC dan bahasa konfigurasi yang dengan sengaja menerima ulasan, koma di belakang, nama tidak disebut atau rentetan petikan tunggal. Format tersebut menyelesaikan masalah pengarangan yang berbeza dan memerlukan penghurai yang melaksanakan tatabahasa mereka sendiri. Pengesah JSON yang ketat tidak seharusnya mentafsir semula mereka secara senyap, kerana menerima sintaks tambahan akan menjadikan keputusannya mengelirukan untuk API, metadata pakej dan destinasi lain yang benar-benar memerlukan JSON standard.
Perbezaan ini juga tidak termasuk penilaian JavaScript sewenang-wenangnya. Menjalankan teks yang ditampal melalui `eval` atau pembina Fungsi semata-mata untuk menukar objek literal kepada data boleh melaksanakan getter, panggilan atau ungkapan bermusuhan lain. Jika sumber itu dipercayai JavaScript di bawah kawalan anda, sirikan nilai sebenar dengan JSON.stringify. Jika sumbernya adalah teks yang tidak dipercayai, jangan laksanakannya.
Bawa pulang: literal ialah kod, JSON ialah data
Bawa pulang: literal ialah kod, JSON ialah data — persamaan visual tidak menjadikan tatabahasa mereka boleh ditukar ganti. JSON memerlukan rentetan petikan dua dan nama ahli, sahaja membenarkan set kecil jenis nilai tetap dan tidak mengandungi ulasan atau ungkapan boleh laku. Diagnostik baris dan lajur menandakan tempat pertama sumber yang disalin meninggalkan tatabahasa itu. Membaiki titik itu dan mengesahkan semula adalah lebih dipercayai daripada menggunakan carian dan penggantian yang luas pada tempat pembuangan konsol.
Apabila anda mengawal nilai JavaScript, hasilkan JSON dengan JSON.stringify dan bukannya menyalin perwakilan konsolnya. Apabila anda menerima teks, huraikannya sahaja dengan penghurai untuk format yang diisytiharkan dan jangan sekali-kali melaksanakannya sebagai pintasan. Pengesahan JSON yang berjaya menetapkan sintaks, bukan ketepatan angka, pematuhan skema atau pengendalian harta hiliran yang selamat.