Bahasa Melayu

Alat pembangun · Penukar sintaks

Adakah JSON sah YAML? Apa yang YAML 1.2 janjikan dan di mana ia rosak

· Latar belakang

json yaml format data

Dokumen JSON dipasang di dalam bingkai gaya aliran YAML dengan ciri YAML sahaja di luar
Ilustrasi vektor ToolAcre asal

YAML 1.2 direka supaya setiap JSON dokumen juga merupakan dokumen YAML, itulah sebabnya JSON kepada YAML penukaran terasa remeh. Siaran ini menerangkan apa yang sebenarnya dijamin oleh spesifikasi dan kes kelebihan apabila janji itu gagal.

Menampal JSON ke dalam fail YAML dan menjauhinya — mengapa ia berfungsi dan pada satu masa ia tidak

Objek JSON biasa boleh ditampal pada bahagian sumber YAML dan dibaca di bawah skema ToolAcre YAML 1.2 JSON. Tanda kurung, kurungan, kekunci petikan, rentetan, nombor, boolean dan null menjadi nilai JavaScript biasa yang sama. Itu menjelaskan mengapa sempadan sering terasa remeh.

Jaminan harus kekal khusus penghurai. ToolAcre mengehadkan teg, menutup alias dan bersarang dan menggunakan had input. Teks boleh sah di bawah pemproses YAML yang lebih luas namun ditolak di sini atas sebab keselamatan atau bentuk yang tidak berkaitan dengan terasnya yang kelihatan JSON.

JSON biasa dimuatkan melalui pembaca YAML 1.2 ini; sambungan yang tidak disokong gagal atas sebab yang berasingan

Skema yang dipilih menghasilkan nilai berbentuk JSON: rentetan, nombor, boolean, nol, tatasusunan dan pemetaan. Penjajaran ini membolehkan menghurai-kemudian-bersiri dan bukannya penggantian tanda baca. Kod sumber tidak menetapkan setiap perkataan atau erratum spesifikasi YAML, jadi artikel melaporkan tingkah laku yang diuji dan bukannya menuntut pematuhan menyeluruh.

Di bawah mod ketat, tilde, nilai kosong dan `0o755` rentetan kekal. Itu adalah YAML token JSON sendiri tidak akan mengandungi. Teras menyelesaikannya secara berbeza sambil tetap mengembalikan output berbentuk JSON.

Skema yang dihantar sejajar dengan data berbentuk JSON tanpa membuktikan setiap kelebihan spesifikasi

Kekunci pemetaan YAML pendua menyimpan nilai terakhir dengan amaran; tafsiran yang ketat di tempat lain mungkin menolaknya. Pembaca YAML 1.1 legasi boleh menaip perkataan seperti `NO` secara berbeza, manakala pembaca ini mengekalkannya sebagai rentetan. Perbezaan tersebut merumitkan kenyataan mudah alih yang luas.

Tab yang digunakan sebagai lekukan menghasilkan ralat, manakala tab di dalam rentetan JSON yang dipetik terlepas. Nilai yang sangat dalam atau bersaiz besar boleh mencapai had keselamatan tempatan. Hubungan bahasa teori tidak mengatasi sempadan pelaksanaan.

Kekunci pendua dan perbezaan penghurai warisan kekal sebagai sempadan kebolehoperasian

Sebaliknya adalah jelas palsu untuk saluran paip nilai ini. YAML ulasan tidak mempunyai perwakilan JSON, alias diselesaikan menjadi data berulang, strim berbilang dokumen menjadi tatasusunan dan teg yang tidak disokong ditolak. Skalar blok menjadi rentetan tetapi persembahannya hilang.

Malah dokumen YAML yang disokong boleh ditukar kepada JSON yang sah dan tidak kembali kepada teks YAML yang sama. Kesamaan data mungkin kekal untuk nilai biasa manakala ulasan, sauh, ejaan dan identiti aliran tidak.

Maksudnya untuk penukaran — JSON kepada YAML ialah perubahan gaya, YAML kepada JSON ialah terjemahan yang boleh kehilangan maklumat

JSON-to-YAML biasanya merupakan gaya dan perubahan bersiri untuk input berbentuk JSON. YAML-to-JSON mula-mula mentafsir sintaks khusus YAML dan kemudian menayangkan hasilnya ke dalam model nilai JSON yang lebih kecil. Arah tidak simetri.

ToolAcre menguji dokumen JSON-ke-YAML-to-JSON biasa yang mengandungi nilai bersarang, Unicode, null, tatasusunan dan rentetan yang kelihatan samar-samar. Lekapan tersebut membuktikan kelas data yang dilindungi, bukan setiap pasangan pemproses JSON atau YAML yang mungkin.

Contoh berfungsi: dokumen JSON dimuatkan sebagai YAML — struktur yang sama, kemudian ciri YAML sahaja ditambahkan untuk menunjukkan di mana perkakas JSON berhenti

Tampal `{"country":"NO","items":[1,null],"nested":{"ok":true}}` sebagai input YAML. Pembaca yang ketat mengembalikan pokok yang sama. Tambahkan ulasan YAML dan nilainya kekal sama semasa ulasan itu hilang. Gantikan objek berulang dengan sauh dan alias; JSON kini mengandungi salinan dan bukannya sintaks rujukan.

Tambahkan `---` dan dokumen kedua; hasilnya menjadi pelbagai dokumen dengan amaran. Tambah `!!binary`; pembaca terhad menolaknya. Setiap langkah menandakan sempadan yang berbeza: pembentangan diabaikan, struktur diselesaikan, konvensyen aliran dan jenis tidak disokong.

Perkara ini tidak meliputi — keserasian peringkat skema, di mana YAML jenis seperti cap masa tidak mempunyai rakan JSON

Keserasian skema bukan sahaja mengenai sintaks permukaan. Teras boleh mencipta Infinity atau NaN, yang JSON tulis sebagai batal dengan amaran. Cap masa dan teg binari ditolak di bawah skema terhad dan bukannya ditukar. ToolAcre sengaja mengecilkan YAML kepada data berbentuk JSON yang selamat.

Pelaksanaan YAML lain mungkin menyokong jenis tambahan. Itu menjadikannya kurang serasi dengan nilai JSON biasa pada titik tersebut, bukan secara automatik lebih baik atau lebih teruk. Pilih berdasarkan kontrak sasaran dan keperluan keselamatan.

Keserasian peringkat skema termasuk nilai tidak terhingga dan teg temporal yang dihadkan atau ditolak oleh pembaca terhad ini

Data berbentuk JSON biasa melalui pembaca dan penulis YAML 1.2 ini. Tuntutan yang lebih luas tentang semua dokumen atau penghurai memerlukan lekapan yang meliputi kunci pendua, versi skema, teg dan had sumber.

Gunakan penukar Sintaks untuk menguji teks sebenar dan membaca amarannya. Anggap “JSON ialah YAML” sebagai trengkas yang berguna sahaja selepas menamakan penghurai, skema dan ciri tidak disokong yang menjadikan sempadan sebenar tepat.

Untuk ujian mudah alih, simpan satu lekapan sepenuhnya dalam model nilai JSON dan satu lagi yang menambah satu ciri YAML sahaja pada satu masa. Jalankan kedua-duanya melalui setiap pengguna yang dimaksudkan. Yang pertama mengukur tuntutan subset praktikal; yang kedua mengenal pasti dengan tepat di mana ulasan, alias, strim, teg atau peraturan skalar bercapah. Kaedah berperingkat ini lebih bermaklumat daripada bertanya sama ada dua bahasa adalah subset dalam abstrak, kerana ia menghasilkan kegagalan yang terikat pada penghurai yang sebenarnya digunakan oleh sistem anda.