Alat pengembang · Konverter sintaksis
YAML hingga JSON mengetikkan paksaan: bagaimana ya, tidak, dan 0777 mengubah makna
· Cara kerjanya
yaml json format data
YAML menyelesaikan skalar yang tidak dikutip menjadi tipe, dan aturannya berbeda antara YAML 1.1 dan 1.2. Posting ini menunjukkan dengan tepat bagaimana konverter memutuskan bahwa suatu nilai adalah boolean, integer, float atau string, dan bagaimana mengontrol hasilnya.
Nilai yang kembali sebagai benar — skalar YAML biasa yang dimaksudkan sebagai teks, dikonversi ke JSON sebagai boolean, dan layanan yang kemudian berperilaku buruk
Nilai seperti `NO` bisa menjadi salah di loader YAML 1.1, namun bukan itu yang dikirimkan konverter ini. Kedua pilihan ToolAcre menggunakan skema YAML 1.2, jadi `NO`, `yes`, `no`, `on` dan `off` tetap berupa string. Pembukaan yang dikoreksi penting karena contoh yang mengklaim bahwa panel ini mengubah `NO` menjadi benar atau salah akan mengajarkan kebalikan dari perilaku yang diuji.
Jenis kejutan masih ada. Di bawah skema JSON default, `null` adalah null sedangkan `~`, nilai kosong dan `0o755` tetap berupa string. Memilih Inti akan mengubah ketiga bentuk tersebut menjadi null, null dan 493. Outputnya berguna justru karena memperlihatkan nilai JavaScript yang telah diselesaikan, daripada berpura-pura bahwa setiap token YAML biasa memiliki tipe yang jelas.
Nilai yang tetap berupa teks di bawah YAML 1.2
Resolusi implisit terjadi saat js-yaml membaca sumbernya. Skema terbatas yang dipilih memutuskan apakah skalar biasa cocok dengan bentuk null, Boolean, atau numerik sebelum konverter menulis JSON. Mengutip mengabaikan keputusan itu: `"0o755"` adalah teks di bawah skema mana pun, dan skalar blok tetap berupa string termasuk jeda baris yang diwakili oleh indikator chompingnya.
Ini adalah penguraian dan serialisasi, bukan penggantian ekspresi reguler. Pembaca membuat string, angka, boolean, null, array, dan objek; `JSON.stringify` lalu memancarkan nilai tersebut dengan lekukan yang dipilih. Komentar dan ejaan token sudah hilang pada tahap penulisan, sehingga tidak ada pembuat serial yang dapat merekonstruksi apakah suatu bilangan aslinya desimal atau ditulis dalam notasi YAML lain yang diterima.
Aturan YAML 1.1 — yes/no/on/off boolean, 0777 sebagai oktal, 1:30 sebagai sexagesimal, dan string versi seperti 1.10 dibaca sebagai float
Garis besarnya mencantumkan YAML 1.1 paksaan seperti waktu sexagesimal dan oktal lama. Ini merupakan bahaya kompatibilitas yang relevan, namun bukan mode yang tersedia di sini. ToolAcre sengaja tidak menawarkan skema 1.1. UI-nya mengatakan bahwa tidak ada opsi yang dikirimkan yang membaca `NO` sebagai salah, dan pengujian menyematkan kode negara tersebut dan kata-kata ya, tidak, hidup dan mati sebagai string.
Batasan itu mengubah metode debugging. Jika aplikasi lain mengubah kata-kata tersebut menjadi boolean, bandingkan konfigurasi parsernya dengan ToolAcre daripada mengharapkan keluaran yang sama. Konverter dapat menunjukkan apa yang dihasilkan oleh dua skemanya; ia tidak dapat mengesahkan skema atau versi yang digunakan oleh pelari CI, kerangka kerja, atau sistem penerapan yang kemudian menggunakan file tersebut.
YAML 1.1 paksaan adalah bahaya yang dihindari konverter ini
Skema JSON default hanya menerima ejaan skalar yang kompatibel dengan model JSON. Core menambahkan bentuk null YAML yang sudah dikenal, bilangan bulat heksadesimal dan oktal, Infinity dan NaN. Inti masih tetap berada di dalam pemuat terbatas: tag objek, tanggal, set, peta terurut, dan tag biner khusus bahasa ditolak daripada dibuat.
Infinity dan NaN mengungkap batasan lain. JavaScript dapat menampungnya, namun JSON tidak dapat menulisnya. Konverter mengidentifikasi setiap jalur dan memperingatkan bahwa nilainya menjadi nol. Ini adalah langkah yang merugikan, bukan pertobatan yang tidak merugikan. `.inf` yang dikutip menghindarinya karena nilainya tetap berupa string literal `.inf`.
Kedua skema YAML 1.2 yang dikirimkan hanya berbeda pada formulir skalar yang terdokumentasi
Tempel `tilde: ~`, `empty:`, `octal: 0o755`, `country: NO` dan `answer: yes`. Dengan pemilihan ketat, nilai JSON adalah `"~"`, `""`, `"0o755"`, `"NO"` dan `"yes"`. Dengan memilih Inti, hanya tiga yang pertama yang berubah: tilde dan kosong menjadi nol, dan oktal menjadi 493. Negara dan jawaban tetap berupa teks di kedua keluaran.
Sekarang kutip setiap nilai dan ulangi. Kedua skema mengembalikan string karena sumber menyatakan tipe yang diinginkan. Perbandingan ini akurat dalam kode dan lebih berguna daripada membandingkan YAML 1.1 dengan 1.2 di dalam alat yang tidak pernah memuat 1.1. Ini juga memberikan perlengkapan yang dapat ditinjau untuk memeriksa parser lain tanpa menebak dari dokumentasinya saja.
Contoh praktis: satu file di bawah skema ketat dan Inti ToolAcre
Tag standar eksplisit diterima hanya jika skema terbatas mengenalinya: `!!str 123` menjadi string `123`, sedangkan `!!int "7"` menjadi angka 7. Tag seperti `!!binary`, `!!timestamp`, `!!set`, `!!js/function` dan konstruktor objek Python ditolak. Hal ini mencegah pembaca YAML menjadi pabrik objek sewenang-wenang.
Mengutip tetap menjadi pilihan portabel ketika nilai konfigurasi hanya terlihat diketik. Ini mempertahankan angka nol di depan, ejaan versi, dan kata-kata penjaga tanpa bergantung pada tag eksplisit yang bertahan dari alat lain. Hasil JSON menunjukkan jenis yang dipilih, namun tidak dapat membawa gaya kutipan atau tag yang menghasilkan nilai tersebut.
Apa yang tidak tercakup dalam hal ini — penguraian tingkat aplikasi dari JSON yang dihasilkan, yang mungkin memaksa pengetikan lagi (misalnya, string '1' ke angka)
Kode aplikasi mungkin memaksa JSON yang dihasilkan lagi. API dapat membaca `"1"` dan mengubahnya menjadi angka, atau menolaknya berdasarkan skema. Konverter sintaks berhenti setelah menghasilkan JSON teks; itu tidak menjalankan validator kerangka kerja, pemuat variabel lingkungan, atau aturan bisnis. Oleh karena itu, konversi yang bersih membuktikan sintaksis dan pemetaan, bukan penerimaan oleh layanan akhir.
Kunci duplikat YAML adalah masalah terpisah. ToolAcre menyimpan nilai terakhir dan melaporkan kunci berulang dengan suatu posisi. Aliran multi-dokumen menjadi array. Pilihan tersebut dapat mengubah apa yang dilihat aplikasi bahkan ketika setiap tipe skalar diharapkan, jadi bacalah peringatan daripada hanya menilai isi JSON yang diformat.
Kesimpulan: kutip apa pun yang mungkin salah dibaca oleh mesin — dan bagaimana mengonversi YAML menjadi JSON di browser mengungkapkan dengan tepat tujuan dari setiap skalar
Kutip teks yang menyerupai token mesin, lalu periksa jenis JSON. Gunakan strict ketika Anda menginginkan kosakata skalar terkecil berbentuk JSON; pilih Inti dengan sengaja ketika YAML formulir null dan numerik diperlukan. Tidak ada pilihan yang YAML 1.1, dan tidak ada yang membuat konsumen hilir mengikuti aturan yang sama.
Panel membuat pilihan parsernya terlihat dan mengembalikan peringatan untuk nilai yang tidak dapat diwakili oleh target. Ini adalah janji yang jujur: ini mengungkapkan bagaimana implementasi ini menyelesaikan setiap skalar. Itu tidak mengklaim perilaku YAML universal atau mempertahankan komentar, tag, dan ejaan sepanjang perjalanan.