Bahasa Indonesia

Alat pengembang · JSON pemformat & validator

Valid JSON vs valid terhadap skema: dua arti 'valid'

· Latar belakang

json standar validasi

Valid JSON vs valid terhadap skema: dua arti 'valid' yang diilustrasikan dengan token JSON dan batas validasi yang tepat
Ilustrasi vektor ToolAcre asli

Validator yang mengatakan JSON Anda valid hanya berarti validator tersebut mem-parsing. Posting ini menjelaskan tingkat validitas (sintaks, struktur, semantik) dan mengapa Skema JSON ada untuk segala hal di luar tata bahasa.

Valid, dan masih ditolak

Permintaan bisa saja sempurna JSON dan tetap tidak dapat diterima oleh API. `{"username":"nori","plan":"gold"}` memiliki pembatas yang seimbang, nama yang dikutip, dan nilai hukum, namun layanan mungkin memerlukan email, menolak nama paket, atau melarang pembuatan akun dalam kondisi saat ini. Parser dan aplikasi menjawab pertanyaan yang berbeda, sehingga kedua hasil tersebut mungkin benar.

ToolAcre hanya menjawab pertanyaan pertama: dapatkah teks ini diuraikan sebagai JSON ketat dalam batas masukannya? Itu tidak memuat skema, memeriksa properti yang diperlukan, memverifikasi format, menghubungi database atau mengevaluasi aturan bisnis. Saat alat tersebut menyatakan Valid, bacalah itu sebagai “sintaksis JSON yang dibuat dengan baik,” bukan sebagai persetujuan dari sistem yang akan menggunakan nilai tersebut.

Tingkat satu: sintaksis yang terbentuk dengan baik

Validasi sintaks memeriksa tata bahasa JSON: satu nilai tingkat atas, wadah yang dipasangkan dengan benar, nama objek yang dikutip, koma dan titik dua yang valid, string resmi, nomor resmi, dan literal yang tepat. Ini menolak `NaN` dan `Infinity`, komentar, koma di akhir, dan string tanda kutip tunggal. Ia menerima bentuk tata bahasa apa pun yang valid, termasuk nomor tunggal atau objek dengan bidang yang tidak dikenal.

Sumber yang salah formatnya memiliki titik kegagalan tekstual, sehingga ToolAcre dapat melaporkan baris dan kolom untuk karakter mustahil pertama. Hilangnya koma dapat menyebabkan kutipan berikutnya dilaporkan; koma tambahan dapat menyebabkan pembatas penutup dilaporkan. Memperbaiki sintaksis akan menghasilkan nilai yang dapat diurai tetapi tidak menetapkan bahwa nilai tersebut memiliki bentuk atau makna yang diharapkan oleh program lain.

Tingkat dua: bentuknya

Validasi bentuk menanyakan apakah nilai yang diurai cocok dengan kontrak yang dinyatakan. Skema pengguna mungkin memerlukan `email`, membatasi `age` hingga bilangan bulat setidaknya 18, membatasi `tier` hingga `free` atau `pro`, dan melarang properti yang tidak diketahui. `{"email":false,"tier":"gold"}` adalah sintaks JSON yang valid tetapi gagal dalam aturan struktural tersebut karena tipe nilai dan pilihan yang diizinkan salah.

JSON Skema adalah salah satu cara untuk mengekspresikan batasan tersebut, namun ToolAcre tidak menjalankannya. Validator skema biasanya melaporkan jalur instance seperti `/tier`, kata kunci seperti `enum`, dan pesan penjelasan daripada tanda sisipan parser. Pertahankan versi skema dan kontrak API di samping payload saat mendiagnosis level ini; mengubah tanda baca tidak akan memperbaiki nilai bentuk yang salah yang diurai dengan benar.

Tingkat tiga: makna

Maknanya bergantung pada fakta dan aturan di luar bentuk statis dokumen. `accountId` dapat memiliki pola string yang benar tanpa menyebutkan nama akun. Tanggal mulai dapat cocok dengan format gaya ISO namun jatuh setelah tanggal akhir. Kuantitasnya bisa positif namun melebihi stok saat ini. Kegagalan ini memerlukan konteks aplikasi, status tersimpan, atau hubungan antar bidang.

Beberapa batasan semantik dapat didekati dalam suatu skema, namun banyak di antaranya termasuk dalam logika layanan di mana data otoritatif dan status transaksi tersedia. Respons kesalahan pada tingkat ini harus mengidentifikasi bidang atau aturan yang relevan tanpa berpura-pura bahwa format teks JSON salah. ToolAcre tidak dapat mereproduksi keputusan tersebut karena tidak mengetahui kontrak atau mengirimkan masukan ke aplikasi yang memiliki aturan bisnis.

Contoh praktis: satu muatan melalui tiga pemeriksaan

Mulailah dengan `{"sku":"A-19","quantity":3,"warehouse":"north"}`. ToolAcre menerimanya: semua nama dan nilai mengikuti tata bahasa JSON. Skema kemudian dapat memerlukan objek, string yang tidak kosong SKU, jumlah bilangan bulat positif dan salah satu kode gudang yang didokumentasikan. Misalkan payload ini melewati batasan tersebut juga. Tidak ada pemeriksaan yang memastikan bahwa SKU A-19 ada atau bahwa utara memiliki tiga unit.

Layanan inventaris melakukan pemeriksaan ketiga terhadap catatan saat ini dan mungkin menolak permintaan karena tidak tersedia. Mengubah indentasi tidak dapat mengubah hasil tersebut. Jika `quantity` ditulis sebagai `03`, sintaksisnya akan gagal terlebih dahulu; jika `"3"`, penguraian akan berhasil tetapi pemeriksaan jenis skema akan gagal; dengan angka `3`, hanya aturan ternak hidup yang tersisa. Oleh karena itu, bidang yang sama dapat gagal pada tiga lapisan berbeda karena tiga alasan berbeda.

Di mana setiap cek berada

Jalankan validasi sintaksis sedini mungkin saat mengedit, karena pemeriksaan selanjutnya tidak dapat beroperasi dengan andal pada teks yang tidak diurai. Terapkan bentuk yang dideklarasikan pada setiap batas aplikasi yang tidak tepercaya daripada berasumsi klien sudah melakukannya. Evaluasi invarian bisnis dalam komponen yang memiliki status yang diperlukan, terutama ketika jawabannya dapat berubah antar permintaan.

Pemeriksaan sisi klien meningkatkan masukan namun tidak menggantikan penegakan sisi server. Sebaliknya, respons server yang mengatakan “JSON tidak valid” harus digunakan untuk kegagalan penguraian daripada digunakan untuk setiap permintaan yang ditolak. Pemisahan yang jelas menghasilkan diagnostik yang berguna: baris dan kolom untuk sintaksis, jalur contoh untuk batasan struktural, dan kode atau pesan khusus domain untuk konflik semantik. ToolAcre hanya memasok kategori pertama.

Hal ini tidak tercakup dalam hal ini

Pemformat ini tidak membuat atau mengevaluasi Skema JSON, memilih draf skema, menyelesaikan referensi skema, menyisipkan default, atau memaksakan string ke dalam angka. Ia juga tidak mengetahui dokumen OpenAPI atau konvensi validasi khusus API. Menyediakan skema bersama masukan tidak akan mengubah hasil ToolAcre karena tidak ada langkah pemrosesan skema di alat ini.

Validasi sintaksis juga tidak mendeteksi nama objek duplikat di sini; `JSON.parse` menyimpan kemunculan terakhir sebelum memformat. Juga tidak menjamin presisi numerik, byte kanonik, rendering atau otorisasi yang aman. Masing-masing permasalahan tersebut memerlukan kontrak dan implementasinya sendiri. Hindari mengompresnya menjadi satu lencana “valid” berwarna hijau, karena hal ini akan menyembunyikan bukti mana yang telah dikumpulkan dan pertanyaan mana yang tidak pernah diajukan.

Kesimpulan: 'valid' memerlukan kualifikasi

Kualifikasi setiap klaim validasi. “Valid JSON” berarti teks mengikuti tata bahasa. “Valid terhadap skema ini” berarti nilai yang diurai memenuhi kontrak struktural yang disebutkan. “Diterima oleh layanan” berarti aturan aplikasi saat ini mengizinkan pengoperasian. Melewati satu lapisan diperlukan untuk lapisan berikutnya dalam banyak alur kerja, namun tidak pernah menjadi bukti bahwa semua lapisan berikutnya berhasil dilewati.

Gunakan ToolAcre untuk memformat dan memeriksa sintaksis yang ketat, termasuk penolakan literal non-JSON seperti `NaN` dan `Infinity`. Kemudian gunakan skema dan aplikasi yang benar-benar mengatur payload. Jika permintaan masih gagal, baca kesalahan pada lapisannya sendiri daripada berulang kali memformat ulang JSON yang benar. Alat ini tidak memiliki pemeriksaan skema, dan batasan eksplisit tersebut lebih berguna daripada janji validitas yang berlebihan.