Alat pengembang · Konverter sintaksis
Masalah Norwegia: YAML 1.1 vs 1.2 dan mengapa NO menjadi salah
· Latar belakang
yaml format data melakukan debug
Dalam YAML 1.1 nilai NO yang tidak diberi tanda kutip adalah boolean, sehingga Norwegia menghilang dari daftar negara. Posting ini menceritakan sejarah pengetikan implisit YAML, apa yang diubah oleh spesifikasi 1.2, dan mengapa masalah tetap ada pada alat saat ini.
Daftar negara yang satu negaranya hilang — TIDAK diurai sebagai salah, dan laporan bug dari kantor Oslo
Bug klasiknya adalah kode negara `NO` yang tidak dikutip menjadi salah. Pengujian ToolAcre membuktikan bahwa hal itu tidak terjadi di sini: kedua opsi skema tetap `NO`, ya, tidak, aktif dan nonaktif sebagai string. Pembukaan cerita dengan hilangnya Norwegia dalam panel ini akan bertentangan dengan implementasinya.
Contoh ini tetap berguna sebagai peringatan kompatibilitas. Ketika konsumen YAML lainnya menggunakan aturan lama, penulis ToolAcre mengutip string yang ambigu sehingga pembaca hilir tidak menafsirkannya kembali. Pembaca dan penulis dikonfigurasikan untuk mencegah kegagalan yang dijelaskan dalam garis besar.
Norwegia tidak hilang dalam konverter ini: TIDAK tetap ada teks
Repositori ini mendokumentasikan pembatasan js-yaml JSON dan Skema inti dan perilaku skalar yang diamati. Itu tidak mengandung sumber untuk YAML'S 2001 asal usul, niat penulis, atau perdebatan desain sejarah. Klaim-klaim tersebut dihilangkan dan bukannya direkonstruksi dari ingatan.
Mekanisme yang ada saat ini sudah cukup sebagai panduan praktis. Resolusi skalar biasa terjadi berdasarkan skema yang dipilih; nilai yang dikutip tetap berupa teks; tag yang tidak didukung ditolak. Bukti tentang kode tidak boleh direntangkan ke dalam sejarah standar yang tidak bersumber.
Bukti repositori mencakup konfigurasi parser saat ini, bukan riwayat asal YAML
YAML 1.1 umumnya memperlakukan varian ya, tidak, aktif dan nonaktif sebagai boolean. Hal ini menjelaskan mengapa masalah Norwegia terjadi di beberapa ekosistem. ToolAcre tidak memperlihatkan tombol 1.1 dan tidak pernah mendemonstrasikan konversi oktal sexagesimal atau warisan dalam mode seperti itu.
Gunakan bahaya untuk meninjau keluaran parser eksternal, bukan untuk memprediksi panel ini. Jika alat lain menghasilkan false, catat perpustakaan dan skemanya. Hasil ToolAcre dapat berfungsi sebagai pembacaan YAML 1.2 yang kontras, namun bukan sebagai bukti bahwa implementasi lainnya tidak dikonfigurasi dengan benar untuk kontraknya.
Boolean YAML 1.1 lawas menjelaskan bahayanya tetapi tidak diaktifkan di sini
Skema JSON yang ketat hanya mengenali ejaan skalar yang kompatibel dengan JSON. Core juga menyelesaikan nilai tilde dan nilai kosong menjadi bilangan bulat null, heksadesimal atau `0o`, dan bilangan tidak terbatas. Tidak ada yang memperluas kosakata Boolean lebih dari benar dan salah.
Core Infinity dan NaN kemudian menjadi null di JSON dengan peringatan karena JSON tidak memiliki representasi untuk keduanya. Oleh karena itu, perbedaan antara opsi skema terlihat dan terkadang merugikan, meskipun nilai Norwegia sendiri tetap stabil.
Kedua opsi yang dikirimkan adalah skema YAML 1.2
Perilaku warisan tetap bertahan di mana pun parser default atau konvensi aplikasi mempertahankannya. Konverter tidak dapat menginventarisasi perpustakaan atau versi tersebut dari bukti repositori. Uji konsumen sebenarnya dengan perlengkapan yang berisi kata-kata ambigu dan kemiripan numerik.
Penulis ToolAcre YAML menambahkan kutipan pelindung di sekitar string yang mungkin diketik secara berbeda oleh pembaca yang lebih tua, termasuk `NO`, `yes`, `1.0`, `0755` dan teks bertanggal. Output kompatibilitas ini dapat diukur dan lebih aman daripada pernyataan menyeluruh tentang adopsi parser modern.
Bahaya tetap ada di parser lain; verifikasi mereka daripada menggeneralisasi dari alat ini
Konversi `countries: [SE, NO, DK]`, `answers: [yes, no, on, off]`, `mode: 0755`, `octal: 0o755`, `version: 1.10` dan `empty:`. Di bawah ketat, semua kecuali JSON-nilai asli tetap berupa string. Di bawah Inti, oktal menjadi 493 dan kosong menjadi nol; negara dan kata jawabannya tetap berupa string.
Kutip setiap token untuk memaksa teks. Kemudian tulis kembali hasil JSON ke YAML dan periksa kutipan yang dipilih serializer. Perbandingan kode yang akurat ini mengungkapkan aturan alat tanpa berpura-pura menjalankan mode YAML 1.1 yang tidak ada.
Contoh praktis: kode negara dan kemiripan skalar dalam dua skema yang dikirimkan
Sakelar parser khusus bahasa, versi default, dan pembungkus kerangka kerja berada di luar implementasi ini. Nama dan perilaku mereka berubah dengan sendirinya. Konsultasikan dan uji komponen yang akan menggunakan konfigurasi.
Panel juga tidak memvalidasi semantik aplikasi. Mempertahankan `NO` sebagai string diperlukan untuk kode negara, namun tidak dapat membuktikan bahwa `NO` adalah nilai yang diizinkan dalam skema tertentu.
Kesimpulan: kutip string Anda, ketahui versi parser Anda — dan bagaimana mengonversi YAML menjadi JSON di browser membuat pengetikan implisit terlihat
Teks kutipan yang dapat diketik ulang, mengetahui skema yang sebenarnya digunakan dan menguji konsumen. Dua opsi ToolAcre YAML 1.2 membuat perbedaan terbatasnya terlihat dan dengan sengaja menghindari jebakan Boolean lama.
Pelajarannya bukanlah bahwa setiap parser berperilaku satu arah. Pengetikan implisit adalah konfigurasi, dan konverter harus menyatakan konfigurasi itu. Di sini bukti menunjukkan bahwa Norwegia tetap `"NO"`.
Saat konfigurasi melintasi sistem, tambahkan perlengkapan interoperabilitas yang berisi setiap token ambigu yang diizinkan domain Anda. Konversikan atau parsing di setiap konsumen sebenarnya dan bandingkan nilai yang diketik, bukan dirender YAML. Ini menangkap tabel Boolean lama, aturan oktal, atau perbedaan nilai kosong sebelum daftar negara atau mode izin mencapai produksi. Mengutip string yang diketahui tetap menjadi pertahanan portabel yang paling sederhana karena ia mencatat maksud dalam dokumen dibandingkan mengandalkan default lingkungan.