Konverter YAML ke JSON Gratis
Konversi YAML ke JSON secara instan. Menangani semua sintaks YAML termasuk daftar, peta, dan anchor. Berjalan sepenuhnya di browser Anda.
Apa itu YAML?
YAML (YAML Ain't Markup Language) adalah format serialisasi data yang ramah manusia yang biasa digunakan untuk file konfigurasi. Ini menggunakan indentasi dan sintaks sederhana untuk merepresentasikan struktur data seperti daftar, kamus, dan nilai skalar.
Mengapa Mengonversi YAML ke JSON?
- Kompatibilitas universal · JSON didukung oleh hampir semua bahasa pemrograman dan alat.
- Manajemen konfigurasi · Banyak alat mengharapkan JSON untuk konfigurasi atau pertukaran data.
- Integrasi API · API web biasanya membutuhkan format JSON.
- Pemrosesan data · Konversi file konfigurasi YAML untuk digunakan dalam alur kerja otomatis.
Pertanyaan yang Sering Diajukan
Fitur YAML apa yang didukung?
Konverter mendukung semua fitur YAML standar termasuk peta, daftar, string, angka, boolean, null, string multi-baris, anchor, dan alias.
Apakah struktur YAML kompleks saya akan dikonversi dengan benar?
Ya. Konverter menangani struktur bersarang, daftar objek, komentar (yang dihapus), dan semua sintaks YAML. Jika ada kesalahan sintaks, Anda akan mendapatkan pesan kesalahan yang jelas.
Apakah komentar YAML dipertahankan?
Tidak. Komentar bukan bagian dari struktur data, jadi tidak disertakan dalam output JSON.
Sejarah singkat YAML, spin-off milis tahun 2001
Prasejarah YAML dimulai di milis sml-dev, sebuah cabang dari xml-dev pada awal 2000-an yang mengumpulkan orang-orang yang menganggap XML terlalu berlebihan untuk data yang diedit manusia. Dua jalur paralel bergabung: modul Perl Data::Denter milik Ingy döt Net, yang ditulis sebagai format serialisasi untuk modul Inline Perl, dan pekerjaan bersama oleh Oren Ben-Kiki dan Clark Evans yang bertujuan menyederhanakan XML. Pada 11 Mei 2001, Clark Evans memposting «YAML Draft 0.1» ke sml-dev, dan format ini pertama kali dipublikasikan dalam artikel xmlhack keesokan harinya.
Perluasan akronim awal bersifat sarkas: Yet Another Markup Language, sebuah sindiran atas proliferasi format markup pada tahun 2001. Antara Desember 2001 dan April 2002, para penulis merevisi backronym rekursif YAML Ain't Markup Language: sebagian untuk menegaskan bahwa YAML adalah format serialisasi data bukan format markup dokumen seperti XML atau HTML, dan sebagian karena leluconnya sudah usang. Perluasan rekursif ini masih menjadi tagline resmi di yaml.org hingga hari ini.
Jadwal spesifikasi
- Draft 0.1: 11 Mei 2001, pengumuman di milis sml-dev.
- YAML 1.0: 29 Januari 2004, spesifikasi stabil pertama, oleh Ben-Kiki, Evans, dan Ingy döt Net.
- YAML 1.1: 18 Januari 2005, versi yang masih ditiru secara default oleh sebagian besar parser «warisan». Sumber dari Masalah Norwegia dan sebagian besar cacat implicit-typing.
- YAML 1.2.0: 21 Juli 2009, revisi pertama dengan tujuan eksplisit «superset JSON». Implicit-typing ditulis ulang agar selaras dengan token JSON.
- YAML 1.2.1: 1 Oktober 2009, penyegaran khusus errata dari 1.2.0.
- YAML 1.2.2: 1 Oktober 2021, revisi corrigenda oleh Tim Pengembangan Bahasa YAML baru yang dibentuk pada tahun 2020.
Spesifikasi 1.2.2 secara eksplisit menyatakan bahwa «tidak ada perubahan normatif dari spesifikasi YAML v1.2»; pekerjaan terdiri dari konversi sumber dari DocBook ke Markdown, pembuatan ulang diagram dari teks LaTeX biasa, dan membuka proses pengembangan sehingga kontributor eksternal dapat mengajukan pull request terhadap spesifikasi itu sendiri. Tidak ada bahasa yang dirilis sejak 2009: setiap bug kesesuaian parser sejak saat itu adalah warisan dari 1.1 atau penyimpangan dari spesifikasi yang kini telah bertahan lebih dari lima belas tahun. Tipe MIME resmi application/yaml difinalkan pada tahun 2024; ekstensi file .yaml dan .yml keduanya telah diakui sejak sekitar 2006, dengan .yaml yang direkomendasikan.
Hubungan JSON, «hampir superset»
Spesifikasi YAML 1.2.2 menyatakannya dengan hati-hati: «Karena kebetulan semata, JSON hampir merupakan subset lengkap dari YAML.» JSON muncul di antara YAML 1.0 (2004) dan YAML 1.1 (2005); para penulis YAML baru menyadari tumpang tindih ini secara retroaktif. Tujuan eksplisit revisi 1.2, dengan kata-katanya sendiri, adalah «menjadikan YAML superset ketat dari JSON», dan ini hampir benar untuk dokumen YAML 1.2 berformat JSON tetapi tidak benar untuk YAML 1.1.
Dalam istilah praktis: setiap dokumen JSON adalah valid YAML 1.2; pemetaan gaya alur {"a": 1, "b": [true, null]} diurai secara identik oleh keduanya. Sebagian besar dokumen JSON tidak valid dalam YAML 1.1 karena masalah boolean dan Norwegia: dokumen JSON yang berisi string literal "NO" akan dipancarkan ulang sebagai false jika melalui round-trip lewat parser 1.1 menggunakan pengaturan default. Kebalikannya tidak pernah benar: YAML dapat mengekspresikan hal-hal yang tidak bisa dilakukan JSON, komentar (hilang saat konversi), anchor dan alias (diselesaikan saat konversi), tag (biasanya dibuang), aliran multi-dokumen (hanya yang pertama atau semua-sebagai-array bertahan), dan kunci non-string pada pemetaan.
Masalah Norwegia
Gotcha YAML yang paling banyak dikutip. Namanya diambil dari Norwegia karena kode negara dua huruf ISO 3166-1 untuk Norwegia adalah NO, dan regex boolean YAML 1.1 mencocokkan NO sebagai boolean false. Tulis country: NO dalam YAML 1.1 (atau di parser 1.2 mana pun yang masih default ke perilaku 1.1, yang merupakan sebagian besar dari mereka), urai, dump sebagai JSON, dan Anda mendapatkan {"country": false}. Bugnya tidak terlihat; tidak ada peringatan, tidak ada error tipe, hanya korupsi data.
Regex boolean YAML 1.1 lengkap dari skema resmi yaml.org/type/bool.html adalah:
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
Itu adalah enam leksem (y/n, yes/no, on/off, true/false) dengan tiga varian huruf masing-masing, dua puluh dua string yang semuanya menjadi boolean tanpa peringatan. Daftar respons valid [y, n, maybe] menjadi [true, false, "maybe"]; flag fitur dark_mode: on diurai sebagai dark_mode: true; pengaturan mode port yang ditulis OFF menjadi false. YAML 1.2 memperbaiki ini di level spesifikasi: skema inti yang selaras dengan JSON hanya mengenali true, True, TRUE, false, False, FALSE dan tidak mengenali y/n/yes/no/on/off sama sekali. Namun perbaikan ini belum menyebar ke lapangan; PyYAML dan LibYAML masih default ke 1.1 di semua versi yang saat ini dikirimkan. Konverter ini menggunakan js-yaml v4, yang defaultnya adalah skema YAML 1.2 / JSON-compatible; ini adalah salah satu alasan mengapa konverter sisi browser sebenarnya lebih aman daripada menjalankan yaml.load() di PyYAML dan melakukan konversi dari sana.
Jebakan implicit-typing lainnya
Angka oktal. YAML 1.1 mengikuti konvensi C: angka nol di depan berarti oktal. Jadi 010 diurai sebagai bilangan bulat 8, dan permissions: 0777 (cara yang sangat natural untuk menulis mode file Unix) diurai sebagai 511. Perbaikan YAML 1.2 adalah mengharuskan prefiks eksplisit 0o yang cocok dengan Python modern; 0o777 adalah 511, dan 0777 hanya 777. Parser yang masih menggunakan default 1.1 masih salah dalam hal ini.
Angka sexagesimal. YAML 1.1 mewarisi dari format serialisasi sebelumnya konvensi bahwa urutan kelompok digit desimal yang dipisahkan oleh titik dua harus diurai sebagai bilangan bulat atau float berbasis 60 (sexagesimal). Kasus penggunaan yang diiklankan adalah durasi waktu: 1:11:00 akan diurai sebagai bilangan bulat 4260 (satu jam, sebelas menit dalam detik). Aturan ini masih mengganggu orang dalam praktik ketika mereka menulis timestamp seperti 21:00 atau nomor versi seperti 2:3:4 dan menemukan mereka secara diam-diam diubah paksa menjadi bilangan bulat. Sexagesimal secara diam-diam dihapus dalam YAML 1.2, tetapi PyYAML dan parser default 1.1 lainnya masih menerapkannya.
Auto-koersi datetime. YAML 1.1 juga mendeteksi secara otomatis timestamp ISO 8601 dan mengurainya sebagai tipe tanggal/waktu native bahasa host, yang menjadi masalah jika Anda menginginkan string. Tulis version: 2024-01-15 dan Anda mendapatkan objek Python date, bukan string "2024-01-15". Pelajaran umum yang ditegaskan oleh esai «YAML document from hell» karya Ruud van Asseldonk: selalu bungkus string dalam tanda kutip jika bisa saja diurai sebagai hal lain. Kode negara, nomor versi, mode file, timestamp, dan nilai apa pun yang diambil dari kosakata tetap harus dibungkus dalam tanda kutip tunggal atau ganda.
Anchor, alias, dan merge key
Sistem anchor/alias YAML memungkinkan Anda memberi label pada node dengan &name dan menggunakannya kembali nanti dengan *name. Contoh klasik:
defaults: &defaults timeout: 30 retries: 3 production: <<: *defaults host: prod.example.com
Di sini &defaults melabeli pemetaan, dan <<: *defaults (merge key, sebuah fitur skema 1.1 yang dipertahankan oleh sebagian besar parser) menyatukannya ke dalam blok produksi. Ketika ini dikonversi ke JSON, alias sepenuhnya diselesaikan; output JSON berisi konten literal yang diulang, bukan referensi. Anchor dan alias menghilang, dan merge key apa pun diratakan.
Mode kegagalan terkenal dari sistem ini adalah serangan billion laughs: karena anchor dapat di-alias berkali-kali dan target alias sendiri dapat berisi alias, file YAML kecil dapat mengembang menjadi struktur dalam memori yang sangat besar (10 level × 10 kali bersarang = 10¹⁰ elemen string). PyYAML, LibYAML, dan lainnya harus menambahkan batas perluasan untuk mengatasi ini. Konverter sisi browser memiliki batas memori alami (tab akan OOM jauh sebelum host menderita), tetapi risiko strukturalnya nyata.
Aliran multi-dokumen dan front matter
Aliran YAML dapat berisi lebih dari satu dokumen. Dokumen dipisahkan oleh baris yang berisi tepat --- (juga digunakan sebagai penanda akhir-direktif di awal dokumen pertama, itulah mengapa front matter di Jekyll, Hugo, dan Eleventy diapit oleh baris ---). Baris yang berisi ... menandai akhir dokumen tanpa memulai dokumen baru, berguna dalam protokol streaming.
Kubernetes menggunakan --- untuk menggabungkan beberapa manifes resource dalam satu file. JSON tidak memiliki padanan. Konverter memiliki tiga pilihan ketika menemui YAML multi-dokumen: pancarkan hanya dokumen pertama, pancarkan array JSON berisi dokumen-dokumen, atau pancarkan satu dokumen JSON per --- yang dipisahkan oleh baris baru (JSON Lines). Sebagian besar konverter default ke opsi pertama atau kedua; loadAll milik js-yaml mengembalikan sebuah array.
String multi-baris, folded vs literal
YAML memiliki dua gaya block-scalar. Gaya literal (|) mempertahankan baris baru secara tepat. Gaya folded (>) mengganti satu baris baru dengan spasi dan mempertahankan baris kosong sebagai pemisah paragraf. Keduanya menerima indikator chomping: |- dan >- menghapus semua baris baru di belakang, |+ dan >+ menyimpan semuanya, dan | atau > yang tidak dimodifikasi («clip») mempertahankan satu baris baru di belakang. Ketika dikonversi ke JSON, kedua gaya menghasilkan nilai string biasa; blok folded menjadi satu string panjang dengan \n yang tertanam hanya di baris kosong yang dipertahankan; blok literal memiliki \n di setiap baris baru.
Apa yang hilang dalam konversi
- Representasi null menyatu. YAML menerima
null,Null,NULL,~, dan nilai kosong (key:dengan tidak ada setelahnya) sebagai null. Kelimanya menjadinulldalam JSON, tidak dapat dibedakan. - Komentar hilang secara diam-diam. Komentar YAML dimulai dengan
#dan spesifikasi 1.2 secara eksplisit menyatakan bahwa komentar hanya untuk presentasi, bukan bagian dari model data. JSON tidak memiliki sintaks komentar. Jika Anda perlu mempertahankannya, simpan sebagai data (misalnya, field_comment) sebelum konversi. - Kunci non-string diubah paksa. Pemetaan YAML mengizinkan node apa pun sebagai kunci, termasuk bilangan bulat (
1: foo), boolean (true: yes), bahkan urutan bersarang. JSON memerlukan kunci string. Sebagian besar konverter mengubahnya menjadi string ("1": "foo"); ada yang menghasilkan error. - Tag biasanya dibuang. Tag kustom seperti
!!set,!!omap, atau spesifik aplikasi!myapp/Typetidak memiliki padanan JSON. - Datetime melakukan round-trip sebagai string. Tanggal atau timestamp YAML biasanya menjadi string ISO 8601 dalam JSON, karena JSON tidak memiliki tipe tanggal native.
- Bilangan bulat besar kehilangan presisi di JavaScript. Angka JSON adalah double IEEE 754 di JS, sehingga bilangan bulat YAML seperti
9007199254740993secara diam-diam menjadi9007199254740992setelah konversi. - Anchor diperluas. Graf YAML yang berbagi sub-pohon di beberapa posisi menjadi pohon JSON dengan sub-pohon tersebut diduplikasi. Referensi siklik (yang diizinkan oleh YAML) sama sekali tidak dapat direpresentasikan dalam JSON.
Di mana YAML sebenarnya digunakan
YAML ada di mana-mana dalam infrastruktur modern: manifes Kubernetes (seluruh model objek secara konvensional menggunakan YAML; file multi-dokumen yang dipisahkan oleh --- adalah standar), Docker Compose (docker-compose.yml untuk layanan, jaringan, volume), GitHub Actions (.github/workflows/*.yml: skema YAML 1.2 yang ketat sebagian besar dipatuhi tetapi parser masih mengenali on: sebagai kunci, sebuah hampir-masalah Norwegia yang secara eksplisit diatasi oleh GitHub), GitLab CI/CD, playbook Ansible, CircleCI / Travis CI / Drone / Bitbucket Pipelines, front matter Jekyll / Hugo / Eleventy / Gatsby / Astro, spesifikasi OpenAPI / Swagger (secara resmi «sebuah objek JSON yang dapat direpresentasikan baik dalam JSON maupun YAML»), konfigurasi tumpukan monitoring Prometheus / Grafana / Loki / Tempo, cloud-init (provisi boot pertama VM EC2/GCE/Azure), dan AWS CloudFormation / Azure Resource Manager / Google Cloud Deployment Manager. Untuk sebagian besar ini, konversi YAML-ke-JSON sangat penting ketika Anda menyematkan konfigurasi ke protokol khusus JSON, membandingkan file dengan jq, atau mengumpankan output ke alat yang mengharapkan JSON.
Mengapa konversi sisi browser lebih aman daripada sisi server
yaml.load() milik PyYAML dengan pengaturan default dapat mengeksekusi kode Python arbitrer pada input yang tidak tepercaya melalui tag !!python/object, yang melakukan deserialisasi menjadi objek Python aktual dengan efek samping; CVE-2017-18342, skor CVSS v3.1 9.8 (Critical), diperbaiki dalam PyYAML 5.1 (Maret 2019) dengan mendepresiasi default yang tidak aman dan menjadikan safe_load() sebagai titik masuk yang direkomendasikan. SnakeYAML Java memiliki padanannya sendiri (CVE-2022-1471, juga CVSS 9.8) di sekitar kelas Constructor yang memungkinkan instansiasi arbitrer. Crate serde_yaml de facto Rust didepresiasi pada Maret 2024; ekosistem masih menentukan penerusnya (serde_yml, serde_yaml_ng, serde_norway).
Menjalankan parsing di browser melalui js-yaml v4 menghindari semua ini: tidak ada server yang dikompromikan; js-yaml tidak memiliki konsep eksekusi kode arbitrer melalui tag (tag yang tidak dikenal menjadi skalar biasa alih-alih objek yang dikonstruksi); dan v4 default ke skema 1.2 yang lebih aman. Alat Absolutool mendapat manfaat dari ini secara default.
Pertanyaan lainnya
Bagaimana konverter menangani file YAML multi-dokumen?
Ia memuatnya dengan loadAll milik js-yaml, yang mengembalikan array dokumen yang diurai; output JSON karenanya adalah array JSON dengan satu elemen per dokumen yang dipisahkan ---. Jika Anda hanya memiliki satu dokumen, Anda akan mendapatkan array JSON dengan satu elemen; bungkus input Anda dengan penanda ---/... jika Anda menginginkan semantik dokumen tunggal yang eksplisit.
Apakah manifes Kubernetes saya akan terkonversi dengan benar?
Hampir selalu ya. Kubernetes menggunakan konten yang kompatibel dengan YAML 1.2 sebagian besarnya, dan js-yaml v4 menangani semua primitif standar (string, bilangan bulat, boolean, null, urutan, pemetaan) ditambah anchor dan alias. Dua bagian yang tidak bertahan adalah komentar (dihapus) dan anchor apa pun yang diperluaskan menjadi konten berulang alih-alih referensi.
Mengapa kode negara NO saya dibaca sebagai boolean?
Seharusnya tidak terjadi di konverter ini; js-yaml v4 default ke skema YAML 1.2 / JSON-compatible yang tidak mengenali y/n/yes/no/on/off sebagai boolean. Jika Anda mengalami ini di alat lain (PyYAML, misalnya), solusinya adalah membungkus nilai dalam tanda kutip: country: "NO".
Berapa batas ukuran file?
5 MB pada widget unggah, tetapi konten yang ditempel bisa lebih besar jika browser Anda memiliki memorinya. Hambatannya adalah representasi dalam memori, bukan jaringan; tidak ada server dalam loop. Untuk file lebih besar dari ~50 MB, pertimbangkan toolchain YAML desktop (yq di command line, misalnya) sebagai gantinya.