Bahasa Indonesia

Alat pengembang · JSON pemformat & validator

Seluruh tata bahasa JSON dalam satu halaman: enam tipe nilai, dua kontainer

· Latar belakang

json standar validasi

Seluruh tata bahasa JSON dalam satu halaman: enam tipe nilai, dua wadah yang diilustrasikan dengan token JSON dan batas validasi yang tepat
Ilustrasi vektor ToolAcre asli

Seluruh tata bahasa JSON muat dalam satu halaman, dan jika dihafal, setiap kesalahan validator akan terlihat jelas. Postingan ini membahas enam jenis nilai, dua wadah, dan beberapa aturan yang membuat orang tersandung.

Setiap kesalahan yang pernah Anda lihat berasal dari satu halaman

Setiap kesalahan sintaksis adalah harapan yang rusak dalam tata bahasa yang ringkas. Setelah suatu objek terbuka, parser mengharapkan nama anggota yang dikutip atau kurung kurawal penutup; setelah nama, ia mengharapkan titik dua; setelah suatu nilai, ia mengharapkan koma atau akhir wadah. Membaca kesalahan sebagai transisi yang gagal lebih berguna daripada memperlakukan karakter yang dilaporkan sebagai sesuatu yang misterius.

ToolAcre menerima nilai JSON standar dan spasi, lalu menerapkan dua batasan masukan praktis. Teks yang lebih panjang dari 8,000,000 karakter ditolak sebelum diuraikan, dan pemindai yang berada di luar wadah 512 akan ditolak daripada dilintasi tanpa batas waktu. Itu adalah batasan produk, bukan tipe JSON baru. Di dalamnya, diagnostik mengidentifikasi titik pertama di mana aliran token tidak lagi memenuhi tata bahasa.

Enam nilai — objek, array, string, angka, true/false dan null, dan fakta bahwa tidak ada yang lain

Nilai JSON adalah objek, array, string, angka, boolean, atau null. Objek dan array dapat berisi salah satu dari enam objek tersebut, termasuk lebih banyak container. Ejaan literalnya persis `true`, `false` dan `null`; kapitalisasi tidak fleksibel. Token seperti `True`, `None`, `undefined`, `NaN` dan `Infinity` berada di luar batas JSON meskipun bahasa lain mengenali beberapa di antaranya.

Daftar singkat ini menjadikan klasifikasi sebagai teknik debugging yang berguna. Di `{"reading": NaN}`, titik dua memasukkan nilai dengan benar, tetapi `N` tidak dapat memulai nilai apa pun yang diizinkan. Gantilah hanya setelah memutuskan apa arti datanya, mungkin `null` atau status dikutip. Alat sintaksis dapat menolak token; ia tidak dapat memilih pengganti aplikasi atau memutuskan apakah bidang tersebut termasuk di dalamnya.

Objek dan array — anggota yang dipisahkan koma, titik dua, dan alasan RFC 8259 membiarkan pengurutan dan nama duplikat ke implementasi

Objek berisi anggota name/value yang dipisahkan koma. Setiap nama adalah string yang diberi tanda kutip ganda, diikuti dengan titik dua dan sebuah nilai. Array berisi nilai yang dipisahkan koma tanpa nama atau titik dua. Wadah kosong `{}` dan `[]` valid, namun koma tidak boleh mendahului, mengikuti, atau muncul dua kali. Mencocokkan setiap pembatas dengan wadahnya dengan cepat memperlihatkan banyak kegagalan “token tak terduga”.

Nama objek diharapkan unik, namun ejaan duplikat tidak ditolak oleh validator ini. `{"port": 80, "port": 443}` mem-parsing, dan `JSON.parse` mempertahankan nilai selanjutnya. Pemformatan kemudian hanya memancarkan anggota yang bertahan tersebut, sehingga teks sebelumnya tidak dapat dipulihkan dari hasilnya. Posisi array berperilaku berbeda: setiap elemen tetap ada dan urutannya merupakan bagian dari nilai.

String dan angka dengan tepat

String menggunakan tanda kutip ganda. Garis miring terbalik dapat memunculkan tanda kutip, garis miring terbalik, garis miring, `b`, `f`, `n`, `r`, `t`, atau pelolosan Unicode empat digit; karakter kontrol mentah dilarang. Tanda kutip tunggal adalah token biasa yang tidak valid di luar string. Aturan ini menjelaskan mengapa literal JavaScript yang disalin dan teks multibaris yang ditempel dapat terlihat dapat dibaca meskipun gagal dalam validasi JSON yang ketat.

Suatu bilangan dapat mempunyai tanda minus, bagian bilangan bulat, pecahan opsional, dan eksponen opsional. Itu tidak boleh dimulai dengan `+`, menggunakan notasi heksadesimal, membawa nol di depan sebelum digit lainnya, atau mengeja nilai yang tidak terbatas. `-0.25e+2` sah; `01`, `.5`, `2.` dan `Infinity` tidak. Parsing memeriksa tata bahasa, bukan apakah JavaScript dapat mempertahankan setiap digit dengan tepat.

Spasi putih dan tingkat atas

Di luar string, spasi JSON dibatasi pada spasi, tab horizontal, pengumpan baris, dan pengangkutan kembali. Spasi non-breaking yang disalin dari halaman web tidak dapat dipertukarkan dengan spasi biasa. Pemformatan dapat dengan bebas memilih di antara spasi putih yang diizinkan di sekitar token, namun harus mempertahankan spasi putih yang termasuk dalam string yang dikutip karena karakter tersebut adalah data.

Dokumen lengkap dapat berupa nilai JSON apa pun, tidak hanya objek atau larik. `42`, `false` dan `"ready"` adalah teks tingkat atas yang valid. Yang dilarang adalah nilai kedua setelah yang pertama: `42 43` adalah dua dokumen, bukan satu. Perbedaan ini menjelaskan mengapa JSON yang dibatasi baris baru memerlukan penanganan rekaman demi rekaman, bukan satu penguraian keseluruhan file biasa.

Contoh praktis: mengurai dokumen kecil dengan tangan

Ambil `{"order": [17, null, {"paid": true}], "note": "ship soon"}`. Objek akar dimulai dengan anggota bernama `order`; nilainya adalah array yang berisi angka, null, dan objek lain. Koma kemudian memperkenalkan `note`, yang nilainya berupa string dengan baris baru yang di-escape. Setiap titik dua, koma, dan pembatas penutup memiliki satu peran tata bahasa.

Sekarang hapus kutipan sebelum `paid`. Setelah kurung kurawal bersarang, parser mengharapkan kurung kurawal penutup atau nama yang dikutip, sehingga gagal di `p`. Alternatifnya, tambahkan koma setelah `true`; parser menerima koma dan kemudian gagal di `}` karena anggota lain harus mengikuti. Memprediksi posisi tersebut dengan tangan mengubah validasi menjadi konfirmasi dan mencegah pengeditan tanda baca secara acak.

Hal ini tidak tercakup dalam hal ini

Tata bahasanya tidak memiliki tipe tanggal, uang desimal, biner, UUID, atau durasi. Aplikasi biasanya merepresentasikan konsep tersebut dengan string atau angka dan menerapkan konvensi secara terpisah. Stempel waktu dapat berupa string JSON yang benar-benar valid namun berisi tanggal yang mustahil. Demikian pula, objek yang valid secara sintaksis dapat menghilangkan properti yang diperlukan atau menggunakan unit yang salah tanpa melanggar satu aturan penguraian.

ToolAcre tidak melakukan pemeriksaan skema, validasi domain, atau kanonikalisasi. Itu juga tidak menafsirkan ulang fitur JSON5 atau JSONC seperti komentar dan tanda koma. Tugasnya lebih sempit: menerima satu teks JSON yang ketat dalam batas produk, memformat nilai yang diurai, dan mengidentifikasi kegagalan sintaksis. Simpan pertanyaan selanjutnya tentang bentuk dan makna di lapisan validasi aplikasi konsumsi.

Kesimpulan: hafal tata bahasanya, percayai posisinya

Daftar periksa yang tahan lama pendek: enam kategori nilai, nama objek yang dikutip, koma hanya di antara item, titik dua hanya di antara nama dan nilai, pelolosan string yang ketat, ejaan angka yang ketat, empat karakter spasi putih, dan tepat satu nilai tingkat atas. Ketika sebuah dokumen gagal, identifikasikan apa yang diperbolehkan oleh tata bahasa tepat sebelum posisi yang dilaporkan dan bandingkan ekspektasi tersebut dengan karakter yang sebenarnya ada.

Percayai posisi sebagai poin mustahil pertama, tidak selalu karakter yang perlu dihapus. Tanda kurung kurawal penutup dapat disorot karena koma sebelumnya menjanjikan anggota lain; surat yang tidak bersalah mungkin disorot karena kutipan pembukaannya hilang. Perbaiki penyebabnya, jalankan kembali validasi, dan ulangi. Untuk masukan yang terlalu besar atau sangat dalam, atasi batasan produk dengan kedalaman 8-juta karakter atau 512 sebelum diagnostik sintaksis dapat membantu.