YAML
2 alat
Format Serialisasi Data
Serialisasi data adalah proses mengonversi data terstruktur menjadi format yang dapat disimpan atau dikirimkan, lalu direkonstruksi kembali di kemudian hari. Format yang berbeda membuat pertukaran yang berbeda antara keterbacaan manusia, kemampuan parse mesin, ekspresivitas, dan ukuran file.
JSON, YAML, TOML, dan XML adalah empat format serialisasi berbasis teks yang dominan dalam pengembangan perangkat lunak. Masing-masing memiliki kelebihan yang menjadikannya pilihan terbaik dalam konteks tertentu — memahami pertukaran tersebut memungkinkan Anda memilih format yang tepat untuk setiap pekerjaan.
JSON dan YAML Berdampingan
JSON dan YAML merepresentasikan model data yang sama. YAML adalah superset ketat dari JSON — setiap dokumen JSON yang valid juga merupakan YAML yang valid. Berikut adalah konfigurasi yang sama yang dinyatakan dalam kedua format:
{
"server": {
"host": "localhost",
"port": 8080,
"debug": true
},
"database": {
"url": "postgres://localhost/mydb",
"pool": 10
}
}server: host: localhost port: 8080 debug: true database: url: postgres://localhost/mydb pool: 10
YAML menggunakan indentasi sebagai pengganti kurung kurawal dan tanda kurung siku, serta menghilangkan tanda kutip dari sebagian besar nilai string. Ini membuatnya lebih ringkas dan mudah dibaca untuk file yang diedit manusia, tetapi memperkenalkan sensitivitas terhadap indentasi.
Perbandingan Format
| Format | Keterbacaan | Komentar | Array | Terbaik untuk |
|---|---|---|---|---|
| JSON | ★★★☆☆ | Tidak ada komentar | Bawaan | API, pertukaran data |
| YAML | ★★★★★ | Ya (#) | Bawaan | File konfigurasi, IaC |
| TOML | ★★★★☆ | Ya (#) | Bawaan | Konfigurasi aplikasi (Rust, Python) |
| XML | ★★☆☆☆ | Ya (<!-- -->) | Elemen berulang | Dokumen, SOAP, SVG |
Jebakan YAML
YAML sangat powerful tetapi memiliki kasus tepi yang sudah dikenal dan sering mengejutkan developer. Berikut yang paling umum:
Nilai bare 'NO' diinterpretasikan sebagai boolean false dalam YAML 1.1. Kode negara seperti NO (Norwegia), OFF, FALSE, N semuanya diparsing sebagai false. Dalam YAML 1.2 ini sudah diperbaiki, tetapi banyak parser masih menggunakan aturan 1.1. Selalu beri tanda kutip pada string yang ambigu.
YAML menggunakan indentasi untuk mendefinisikan struktur. Satu spasi ekstra atau karakter tab dapat mengubah makna dokumen sepenuhnya. Tab dilarang sebagai indentasi dalam YAML — hanya spasi yang diperbolehkan.
Nilai bare yang terlihat seperti angka, boolean, atau null akan dikonversi secara otomatis. '1.0' menjadi float, '2024-01-01' menjadi objek tanggal di beberapa parser. Beri tanda kutip pada nilai yang ingin tetap berupa string.
Spesifikasi YAML secara eksplisit melarang karakter tab untuk indentasi. Editor yang secara otomatis mengonversi spasi menjadi tab akan diam-diam merusak file YAML Anda. Konfigurasikan editor Anda untuk menggunakan spasi dalam file YAML.
YAML memiliki dua indikator string multiline: | (blok literal, mempertahankan baris baru) dan > (blok terlipat, mengonversi baris baru menjadi spasi). Mencampurnya akan diam-diam menghasilkan keluaran yang salah.
Anchor (&) dan alias (*) YAML memungkinkan penggunaan ulang node, yang powerful tetapi dapat membuat referensi melingkar yang menyebabkan infinite loop atau kehabisan memori pada parser yang naif. Validasi YAML beranchor dari sumber yang tidak tepercaya.
Fitur Unik YAML
Komentar
YAML mendukung komentar dengan karakter #. Ini adalah salah satu keunggulan praktis terbesar dibandingkan JSON untuk file konfigurasi — Anda dapat mendokumentasikan pengaturan secara inline. Komentar dapat muncul pada baris tersendiri atau setelah nilai.
Anchor dan Alias
YAML memungkinkan Anda mendefinisikan sebuah node sekali dengan &nama-anchor dan menggunakannya kembali di mana saja dengan *nama-anchor. Ini menghilangkan pengulangan dalam konfigurasi yang kompleks. Kubernetes dan Docker Compose menggunakan anchor secara ekstensif untuk definisi layanan yang dibagikan.
String Multiline
YAML mendukung blok skalar dengan dua mode: blok literal (|) mempertahankan baris baru persis seperti yang ditulis, berguna untuk skrip dan template. Blok terlipat (>) membungkus string panjang menjadi satu baris, berguna untuk deskripsi prosa yang panjang.
Kapan Anda Perlu Mengonversi
GitHub Actions, GitLab CI, dan CircleCI menggunakan YAML secara native. Ketika menghasilkan konfigurasi pipeline secara terprogram, seringkali lebih mudah membangun objek JSON dan mengonversinya ke YAML untuk keluaran akhir.
Resource Kubernetes didefinisikan dalam YAML, tetapi templating Helm chart dan beberapa alat menghasilkan JSON. Mengonversi antara format memungkinkan Anda memeriksa respons API dan menggunakan alat JSON standar.
REST API mengembalikan JSON. Ketika memasukkan data tersebut ke dalam sistem konfigurasi berbasis YAML (Ansible, Salt, Kubernetes), sebuah konverter menjembatani kesenjangan tanpa perlu memformat ulang secara manual.
Migrasi dari satu alat ke alat lain sering berarti mengonversi format konfigurasinya. Mengonversi antara JSON dan YAML memungkinkan Anda berpindah antar ekosistem (Node.js → Python, Docker → Kubernetes) dengan cepat.
Alat JSON Schema lebih matang dibandingkan YAML Schema. Pola umum adalah menulis konfigurasi dalam YAML untuk keterbacaan, mengonversi ke JSON untuk validasi terhadap skema, lalu mengonversi kembali untuk deployment.
Tooling internal mungkin mengonsumsi konfigurasi YAML sementara API eksternal memerlukan JSON. Sebuah konverter dalam pipeline build menjaga kedua representasi tetap sinkron tanpa perlu memelihara file duplikat.
Pertanyaan yang Sering Diajukan
Ya. YAML 1.2 adalah superset ketat dari JSON — setiap dokumen JSON yang valid juga merupakan YAML yang valid. Namun, YAML 1.1 (masih digunakan oleh banyak parser) memiliki beberapa kasus tepi di mana JSON yang valid bukan merupakan YAML 1.1 yang valid.
YAML mendukung komentar, sedangkan JSON tidak. YAML juga lebih ringkas untuk struktur yang sangat bersarang. Dua properti ini menjadikannya pilihan utama untuk file konfigurasi yang diedit manusia (Docker, Kubernetes, GitHub Actions).
TOML (Tom's Obvious Minimal Language) dirancang untuk file konfigurasi. Sintaksnya jelas, mirip INI, dengan tipe eksplisit dan tanpa ambiguitas. Ini adalah standar untuk proyek Rust (Cargo.toml) dan Python (pyproject.toml).
Jarang, tetapi mungkin. JSON mempertahankan urutan kunci di sebagian besar parser (meskipun spesifikasi menyebutnya tidak berurutan). YAML mendukung anchor dan tag yang tidak memiliki padanan JSON. Untuk fidelitas round-trip, tetap gunakan subset yang umum.
JSON.stringify mengonversi nilai undefined menjadi null dalam array dan menghilangkannya dari objek. Jika Anda melihat null yang tidak terduga atau kunci yang hilang dalam keluaran JSON, objek JavaScript sumber kemungkinan mengandung properti undefined.
Ya. Karena YAML adalah superset dari JSON, Anda dapat menyematkan sintaks JSON langsung di dalam dokumen YAML. Ini terkadang dilakukan untuk struktur bersarang yang kompleks di mana indentasi YAML akan membingungkan.