Bahasa Melayu

Alat pembangun · JSON pemformat & pengesah

Tatabahasa keseluruhan JSON pada satu halaman: enam jenis nilai, dua bekas

· Latar belakang

json piawaian pengesahan

Keseluruhan tatabahasa JSON pada satu halaman: enam jenis nilai, dua bekas yang digambarkan dengan token JSON dan sempadan pengesahan yang tepat
Ilustrasi vektor ToolAcre asal

Keseluruhan tatabahasa JSON sesuai pada satu halaman, dan mengetahuinya dengan hati menjadikan setiap ralat pengesah jelas. Siaran ini membincangkan enam jenis nilai, dua bekas dan segelintir peraturan yang mengelirukan orang ramai.

Setiap ralat yang pernah anda lihat berasal dari satu halaman

Setiap ralat sintaks adalah jangkaan yang rosak dalam tatabahasa padat. Selepas objek dibuka, penghurai mengharapkan nama ahli yang dipetik atau pendakap penutup; selepas nama, ia mengharapkan kolon; selepas nilai, ia menjangkakan koma atau penghujung bekas. Membaca ralat sebagai peralihan yang gagal adalah lebih berguna daripada menganggap watak yang dilaporkan sebagai misteri.

ToolAcre menerima nilai JSON standard dan ruang kosong, kemudian menggunakan dua had input praktikal. Teks lebih panjang daripada 8,000,000 aksara ditolak sebelum menghuraikan dan pengimbas bersarang di luar 512 bekas ditolak dan bukannya dilalui selama-lamanya. Itu adalah sempadan produk, bukan jenis JSON baharu. Di dalamnya, diagnostik mengenal pasti titik pertama di mana aliran token tidak lagi dapat memenuhi tatabahasa.

Enam nilai — objek, tatasusunan, rentetan, nombor, true/false dan null, dan hakikat bahawa tiada apa-apa lagi

Nilai JSON ialah objek, tatasusunan, rentetan, nombor, boolean atau null. Objek dan tatasusunan boleh mengandungi mana-mana daripada enam, termasuk lebih banyak bekas. Ejaan literal ialah `true`, `false` dan `null`; huruf besar tidak fleksibel. Token seperti `True`, `None`, `undefined`, `NaN` dan `Infinity` berada di luar JSON walaupun bahasa lain mengenali sebahagian daripadanya.

Senarai pendek ini menjadikan klasifikasi sebagai teknik penyahpepijatan yang berguna. Dalam `{"reading": NaN}`, kolon dengan betul memperkenalkan nilai, tetapi `N` tidak boleh memulakan sebarang nilai yang dibenarkan. Gantikannya sahaja selepas memutuskan maksud data, mungkin `null` atau status yang disebut. Alat sintaks boleh menolak token; ia tidak boleh memilih pengganti aplikasi atau memutuskan sama ada medan tersebut berada di sana.

Objek dan tatasusunan — ahli yang dipisahkan koma, titik bertindih dan sebab RFC 8259 meninggalkan susunan dan nama pendua kepada pelaksanaan

Objek mengandungi nama/value ahli yang dipisahkan koma. Setiap nama ialah rentetan petikan dua diikuti dengan titik bertindih dan nilai. Tatasusunan mengandungi nilai dipisahkan koma tanpa nama atau titik bertindih. Bekas `{}` dan `[]` kosong adalah sah, tetapi koma tidak boleh mendahului, mengekori atau muncul dua kali. Memadankan setiap pembatas dengan bekasnya dengan cepat mendedahkan banyak kegagalan "token yang tidak dijangka" yang jelas.

Nama objek dijangka unik, namun ejaan pendua tidak ditolak oleh pengesah ini. `{"port": 80, "port": 443}` menghuraikan dan `JSON.parse` mengekalkan nilai kemudian. Pemformatan kemudian mengeluarkan sahaja ahli yang masih hidup itu, jadi teks yang lebih awal tidak boleh dipulihkan daripada hasilnya. Kedudukan tatasusunan berkelakuan berbeza: setiap elemen kekal ada dan susunannya adalah sebahagian daripada nilai.

Rentetan dan nombor dengan tepat

Rentetan menggunakan petikan berganda. Serangan ke belakang boleh memperkenalkan petikan, sengkang ke belakang, sengkang, `b`, `f`, `n`, `r`, `t` atau empat digit Unicode escape; watak kawalan mentah adalah dilarang. Petikan tunggal ialah token tidak sah biasa di luar rentetan. Peraturan ini menerangkan sebab menyalin JavaScript literal dan teks berbilang baris yang ditampal boleh kelihatan boleh dibaca semasa gagal pengesahan JSON yang ketat.

Nombor mungkin mempunyai tanda tolak, bahagian integer, pecahan pilihan dan eksponen pilihan. Ia tidak boleh bermula dengan `+`, menggunakan tatatanda heksadesimal, membawa sifar pendahuluan sebelum digit lain atau mengeja nilai tidak terhingga. `-0.25e+2` adalah sah; `01`, `.5`, `2.` dan `Infinity` tidak. Penghuraian menyemak tatabahasa, bukan sama ada JavaScript boleh mengekalkan setiap digit dengan tepat.

Ruang kosong dan tingkat atas

Di luar rentetan, JSON ruang kosong terhad kepada ruang, tab mendatar, suapan baris dan pemulangan pengangkutan. Ruang tidak pecah yang disalin daripada halaman web tidak boleh ditukar ganti dengan ruang biasa. Pemformatan boleh memilih secara bebas antara ruang kosong yang dibenarkan di sekeliling token, tetapi ia mesti mengekalkan ruang kosong yang berada dalam rentetan yang disebut kerana aksara tersebut adalah data.

Dokumen lengkap mungkin mana-mana nilai JSON tunggal, bukan sahaja objek atau tatasusunan. `42`, `false` dan `"ready"` ialah teks peringkat atas yang sah. Apa yang dilarang ialah nilai kedua selepas yang pertama: `42 43` ialah dua dokumen, bukan satu. Perbezaan ini menerangkan sebab JSON yang dibatasi baris baharu memerlukan pengendalian rekod demi rekod dan bukannya satu penghuraian biasa bagi keseluruhan fail.

Contoh yang berfungsi: menghuraikan dokumen kecil dengan tangan

Ambil `{"order": [17, null, {"paid": true}], "note": "ship soon"}`. Objek akar bermula dengan ahli bernama `order`; nilainya ialah tatasusunan yang mengandungi nombor, null dan satu lagi objek. Koma kemudian memperkenalkan `note`, yang nilainya ialah rentetan dengan baris baharu yang dilepaskan. Setiap titik bertindih, koma dan pembatas penutup memainkan satu peranan tatabahasa.

Sekarang alih keluar petikan sebelum `paid`. Selepas pendakap bersarang, penghurai menjangkakan pendakap penutup atau nama yang disebut, jadi ia gagal di `p`. Sebagai alternatif, tambahkan koma selepas `true`; penghurai menerima koma dan kemudian gagal di `}` kerana ahli lain mesti mengikut. Meramalkan kedudukan tersebut dengan tangan menukar pengesahan kepada pengesahan dan tidak menggalakkan pengeditan tanda baca rawak.

Perkara ini tidak meliputi

Tatabahasa tidak mempunyai tarikh, wang perpuluhan, binari, UUID atau jenis tempoh. Aplikasi biasanya mewakili konsep tersebut dengan rentetan atau nombor dan mengenakan konvensyen secara berasingan. Cap masa boleh menjadi rentetan JSON yang sah dengan sempurna sambil mengandungi tarikh yang mustahil. Begitu juga, objek yang sah secara sintaksis boleh meninggalkan sifat yang diperlukan atau menggunakan unit yang salah tanpa melanggar peraturan penghuraian tunggal.

ToolAcre tidak melakukan semakan skema, pengesahan domain atau kanonik. Ia juga tidak mentafsir semula ciri JSON5 atau JSONC seperti ulasan dan koma di belakang. Tugasnya lebih sempit: terima satu teks JSON yang ketat dalam had produk, format nilai yang dihuraikan dan kenal pasti kegagalan sintaks. Simpan soalan kemudian tentang bentuk dan makna dalam lapisan pengesahan aplikasi yang menggunakan.

Bawa pulang: hafal tatabahasa, percaya kedudukan

Senarai semak tahan lama adalah pendek: enam kategori nilai, nama objek yang dipetik, koma sahaja antara item, titik bertindih sahaja antara nama dan nilai, pelepasan rentetan yang ketat, ejaan nombor yang ketat, empat aksara ruang kosong dan tepat satu nilai peringkat teratas. Apabila dokumen gagal, kenal pasti tatabahasa yang dibenarkan serta-merta sebelum kedudukan yang dilaporkan dan bandingkan jangkaan itu dengan watak yang sebenarnya ada.

Percayai kedudukan sebagai titik mustahil pertama, bukan selalu watak yang memerlukan pemadaman. Tanda kurung penutup mungkin diserlahkan kerana koma sebelumnya menjanjikan ahli lain; surat tidak bersalah mungkin diserlahkan kerana petikan pembukaannya tiada. Baiki punca, jalankan semula pengesahan dan ulangi. Untuk input bersaiz besar atau sangat mendalam, atasi sempadan produk yang 8-juta-watak atau 512-depth sebelum diagnostik sintaks boleh membantu.