Alat pengembang · Konverter sintaksis
Apakah JSON valid YAML? Apa yang YAML 1.2 janjikan dan di mana pelanggarannya
· Latar belakang
json yaml format data
YAML 1.2 dirancang sedemikian rupa sehingga setiap dokumen JSON juga merupakan dokumen YAML, itulah sebabnya konversi JSON ke YAML terasa sepele. Posting ini menjelaskan apa yang sebenarnya dijamin oleh spesifikasi dan kasus-kasus edge di mana janji tersebut gagal.
Menempelkan JSON ke dalam file YAML dan lolos begitu saja — mengapa cara ini berhasil, dan kali ini tidak berhasil
Objek JSON biasa dapat ditempelkan ke sisi sumber YAML dan dibaca di bawah skema YAML 1.2 JSON ToolAcre. Tanda kurung kurawal, tanda kurung, kunci tanda kutip, string, angka, boolean, dan null menjadi nilai JavaScript biasa yang sama. Hal ini menjelaskan mengapa batasan tersebut sering kali terasa sepele.
Jaminan tersebut harus tetap spesifik untuk parser. ToolAcre membatasi tag, caps alias, dan nesting, serta menerapkan batas input. Sebuah teks dapat valid di bawah prosesor YAML yang lebih luas namun ditolak di sini karena alasan keamanan atau bentuk yang tidak terkait dengan inti yang tampak JSON.
JSON biasa dimuat melalui pembaca YAML 1.2 ini; ekstensi yang tidak didukung gagal karena alasan yang berbeda
Skema yang dipilih menghasilkan nilai berbentuk JSON: string, angka, boolean, null, array, dan pemetaan. Penyelarasan ini memungkinkan parse-lalu-serialisasi daripada penggantian tanda baca. Kode sumber tidak menetapkan setiap kata atau kesalahan dari spesifikasi YAML, sehingga artikel tersebut melaporkan perilaku yang diuji alih-alih mengklaim kesesuaian yang menyeluruh.
Dalam mode ketat, tanda gelombang, nilai kosong, dan `0o755` tetap menjadi string. Itu adalah YAML token yang JSON itu sendiri tidak akan berisi. Core menyelesaikannya secara berbeda sambil tetap mengembalikan keluaran berbentuk JSON.
Skema yang dikirimkan selaras dengan data berbentuk JSON tanpa membuktikan setiap sisi spesifikasi
Kunci pemetaan YAML duplikat menyimpan nilai terakhir dengan peringatan; interpretasi yang ketat di tempat lain mungkin menolaknya. Pembaca YAML 1.1 lama dapat mengetik kata seperti `NO` secara berbeda, sementara pembaca ini menyimpannya sebagai string. Perbedaan tersebut memperumit pernyataan portabilitas yang luas.
Tab yang digunakan sebagai indentasi menghasilkan kesalahan, sedangkan tab di dalam string JSON yang dikutip akan di-escape. Nilai yang sangat dalam atau terlalu besar dapat mencapai batas keamanan lokal. Hubungan bahasa teoretis tidak mengesampingkan batasan implementasi.
Kunci duplikat dan perbedaan parser lama tetap menjadi batasan interoperabilitas
Kebalikannya jelas salah untuk jalur nilai ini. YAML komentar tidak memiliki representasi JSON, alias berubah menjadi data berulang, aliran multi-dokumen menjadi array, dan tag yang tidak didukung ditolak. Skalar blok menjadi string tetapi presentasinya hilang.
Bahkan dokumen YAML yang didukung dapat dikonversi menjadi JSON yang valid dan tidak pernah kembali ke teks YAML yang sama. Kesetaraan data mungkin bertahan untuk nilai-nilai biasa, sedangkan komentar, jangkar, ejaan, dan identitas aliran tidak.
Artinya bagi konversi — JSON menjadi YAML adalah perubahan gaya, YAML menjadi JSON adalah terjemahan yang dapat menghilangkan informasi
JSON-to-YAML biasanya merupakan perubahan gaya dan serialisasi untuk masukan berbentuk JSON. YAML-to-JSON pertama-tama menafsirkan sintaks khusus YAML dan kemudian memproyeksikan hasilnya ke dalam model nilai JSON yang lebih kecil. Arahnya tidak simetris.
ToolAcre menguji dokumen JSON-to-YAML-to-JSON biasa yang berisi nilai bertingkat, Unicode, null, array, dan string yang tampak ambigu. Perlengkapan tersebut membuktikan kelas data yang tercakup, tidak semua kemungkinan pasangan prosesor JSON atau YAML.
Contoh praktis: dokumen JSON dimuat sebagai YAML — struktur yang sama, lalu fitur khusus YAML ditambahkan untuk menunjukkan di mana alat JSON berhenti
Tempel `{"country":"NO","items":[1,null],"nested":{"ok":true}}` sebagai masukan YAML. Pembaca yang ketat mengembalikan pohon yang sama. Tambahkan komentar YAML dan nilainya tetap sama selama komentar tersebut hilang. Ganti objek berulang dengan jangkar dan alias; JSON sekarang berisi salinan daripada sintaks referensi.
Tambahkan `---` dan dokumen kedua; hasilnya menjadi serangkaian dokumen dengan peringatan. Tambahkan `!!binary`; pembaca terbatas menolaknya. Setiap langkah menandai batasan yang berbeda: presentasi yang diabaikan, struktur yang terselesaikan, konvensi aliran, dan tipe yang tidak didukung.
Apa yang tidak tercakup di sini — kompatibilitas tingkat skema, di mana tipe YAML seperti stempel waktu tidak memiliki padanan JSON
Kompatibilitas skema bukan hanya tentang sintaksis permukaan. Inti dapat membuat Infinity atau NaN, yang JSON tulis sebagai null dengan peringatan. Stempel waktu dan tag biner ditolak berdasarkan skema terbatas daripada dikonversi. ToolAcre sengaja mempersempit YAML menjadi data berbentuk JSON yang aman.
Implementasi YAML lainnya mungkin mendukung tipe tambahan. Hal ini membuatnya kurang kompatibel dengan nilai JSON pada titik tersebut, tidak secara otomatis lebih baik atau lebih buruk. Pilih berdasarkan kontrak target dan persyaratan keamanan.
Kompatibilitas tingkat skema mencakup nilai tidak terbatas dan tag temporal yang dibatasi atau ditolak oleh pembaca terbatas ini
Data biasa berbentuk JSON melewati pembaca dan penulis YAML 1.2 ini. Klaim yang lebih luas tentang semua dokumen atau parser memerlukan perlengkapan yang mencakup kunci duplikat, versi skema, tag, dan batasan sumber daya.
Gunakan konverter Sintaks untuk menguji teks sebenarnya dan membaca peringatannya. Perlakukan “JSON is YAML” sebagai singkatan yang berguna hanya setelah memberi nama parser, skema, dan fitur yang tidak didukung yang membuat batas sebenarnya tepat.
Untuk uji portabilitas, pertahankan satu perlengkapan sepenuhnya di dalam model nilai JSON dan perlengkapan lainnya yang menambahkan satu fitur khusus YAML pada satu waktu. Jalankan keduanya melalui setiap konsumen yang dituju. Yang pertama mengukur klaim subset praktis; yang kedua mengidentifikasi dengan tepat di mana komentar, alias, aliran, tag, atau aturan skalar berbeda. Metode bertahap ini lebih informatif daripada menanyakan apakah dua bahasa merupakan himpunan bagian secara abstrak, karena metode ini menghasilkan kegagalan yang terkait dengan parser yang sebenarnya digunakan sistem Anda.