ToolDeck

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:

JSON
{
  "server": {
    "host": "localhost",
    "port": 8080,
    "debug": true
  },
  "database": {
    "url": "postgres://localhost/mydb",
    "pool": 10
  }
}
YAML
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

FormatKeterbacaanKomentarArrayTerbaik untuk
JSON★★★☆☆Tidak ada komentarBawaanAPI, pertukaran data
YAML★★★★★Ya (#)BawaanFile konfigurasi, IaC
TOML★★★★☆Ya (#)BawaanKonfigurasi aplikasi (Rust, Python)
XML★★☆☆☆Ya (<!-- -->)Elemen berulangDokumen, SOAP, SVG

Jebakan YAML

YAML sangat powerful tetapi memiliki kasus tepi yang sudah dikenal dan sering mengejutkan developer. Berikut yang paling umum:

Masalah Norway

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.

Sensitivitas indentasi

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.

Koersi tipe implisit

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.

Tab dilarang

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.

Mode string multiline

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.

Loop anchor/alias

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

Konfigurasi pipeline CI/CD

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.

Manifest Kubernetes

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.

Pemrosesan respons API

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 konfigurasi

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.

Alur validasi skema

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.

Pertukaran data dengan API

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

Apakah YAML merupakan superset dari JSON?

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.

Mengapa saya memilih YAML daripada JSON untuk file konfigurasi?

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).

Apa itu TOML dan kapan harus menggunakannya?

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).

Apakah mengonversi JSON ke YAML dapat kehilangan informasi?

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.

Apa yang menyebabkan 'undefined' muncul dalam keluaran JSON?

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.

Bisakah saya menggunakan JSON dalam file YAML?

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.