Untuk apa YAML digunakan?

Format data teks lainnya adalah YAML ( Yet Another Markup Language ; nanti, YAML Ain't Markup Language ). Ini digunakan untuk membuat serial objek untuk transmisi melalui jaringan (sama seperti XML dan JSON digunakan dengan cara ini). Karena dapat dibaca manusia, ini juga digunakan untuk menulis file konfigurasi, misalnya untuk Docker, Kubernetes, Ansible, dll. Saat YAML perlu disimpan ke file (misalnya, file konfigurasi), kami menggunakan salah satu dari dua ekstensi: .yaml atau .yml.

Sintaks bahasa

Dalam XML, kurung sudut ( <> ) digunakan untuk menunjuk tag. Di JSON, kami menggunakan kurung kurawal ( {} ). YAML menggunakan baris dan lekukan baru.

Data disimpan sebagai pasangan kunci-nilai, di mana kuncinya adalah string, dan nilainya dapat berupa berbagai tipe data (string, angka, benar/salah, larik, dll.). Kunci ditulis tanpa tanda petik.

Mari kita lihat bagaimana informasi disimpan di YAML:

Jenis Jawa YAML
Bilangan bulat

int number = 5
nomor 5
Angka pecahan

double number = 4.3
nomor: 4.3
variabel Boolean

boolean valid = false
valid: salah
valid: tidak
valid: mati

* Nilai boolean yang valid: benar/salah, ya/tidak, hidup/mati.

Rangkaian

String city = "New York"
kota: New York
kota: 'New York'
kota: "New York"

* Ketiga opsi itu setara.

String dengan karakter khusus

String line = "aaa\nbbb"
baris: "aaa\nbbb"
Komentar dalam kode

// comment
# komentar
Obyek

public class Person {
  String name = "Dennis";
  int age = 32;
}

* Kelas objek diberikan sehingga Anda dapat melihat struktur objek.

orang:
  nama: "Dennis"
  umur: 32

* Perhatikan lekukan sebelum atribut. Itu harus sama untuk semua atribut.

Daftar nilai sederhana

var ages = 
    List.of(1, 3, 5, 9, 78, -5);
umur: [1, 3,5,9,78, -5]
umur:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* Kedua opsi setara.
** Setiap elemen daftar ditandai dengan tanda hubung.

Daftar objek

class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
…
List<Person> people = List.of(
        new Person("Ian", 21),     
        new Person("Marina", 25),     
        new Person("Owen", 73)      );
orang:
  - nama: "Ian"
    umur: 21
  - nama: "Marina"
    umur: 25
  - nama: "Owen"
    umur: 73

Seperti di Java, elemen daftar bisa berupa daftar, yaitu objek dapat disarangkan di dalam satu sama lain. Tanda hubung yang menunjukkan elemen berikutnya dari daftar dapat diimbangi secara horizontal relatif terhadap kunci induk, atau terletak tepat di bawahnya. Yang utama adalah semua elemen memiliki format yang sama. Ini akan membantu menghindari kebingungan dan hierarki bersarang yang ambigu.

usia:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
usia:
- 1
- 3
- 5
- 9
- 78
- -5

Ada dua nuansa lagi saat bekerja dengan nilai teks:

  1. Teks multi baris. Kita dapat menyimpan teks seperti ini:

    multilineText: "baris 1\nbaris 2\n....baris n"

    Tapi akan sangat tidak menyenangkan untuk mencoba membacanya. Jadi ada | (pipa) simbol, yang dapat Anda gunakan untuk menulis teks secara berbeda:

    multilineTeks: |
     baris 1
     baris 2
     ....
     baris n

    Anda pasti setuju bahwa opsi kedua lebih nyaman, bukan?

  2. Garis panjang. Jika Anda ingin menyimpan teks dalam satu baris tetapi juga ingin teks tersebut pas di ruang kerja IDE yang terlihat, Anda dapat menggunakan simbol > (lebih besar dari).

    singlelineText: >
     mulai
     ...
     lanjutkan baris yang sama
     ...
     akhir

    Semua teks akan diperlakukan sebagai satu baris.

Jika Anda perlu menulis beberapa struktur data YAML ke dalam satu file, maka Anda perlu memisahkannya dengan --- (tiga tanda hubung). Dalam praktiknya, jarang ada kebutuhan untuk ini, tetapi yang terbaik adalah menyadari kemungkinan ini.

Contoh dokumen YAML

Mari buat beberapa struktur data Java (kelas) dan objek yang sesuai, dan coba untuk merepresentasikan objek sebagai YAML.


class Family {
   private Date weddingDate;
   private Person wife;
   private Person husband;
   private List<Person> children;

   // Getters and setters are omitted
}

class Person {
   private final String name;
   private final boolean isWoman;
   private int age;

   public Person(String name, int age, boolean isWoman) {
       this.name = name;
       this.age = age;
       this.isWoman = isWoman;
   }

// Getters and setters are omitted

}

public static void main(String[] args) {
   Person wife = new Person("Ann", 37, true);
   Person husband = new Person("Alex", 40, false);
   var children = List.of(
           new Person("Iris", 12, true),
           new Person("Olivia", 5, true)
   );
   Date weddingDate = new Date(/* some long */);

   Family family = new Family();
   family.setWeddingDate(weddingDate);
   family.setWife(wife);
   family.setHusband(husband);
   family.setChildren(children);
}

Representasi yang valid dalam YAML:

---
pernikahanTanggal: 2000-12-03
istri:
 nama: Ann
 umur: 37
 isWanita: ya
suami:
 nama: Alex
 umur: 40
 isWanita: tidak punya
anak:
 - nama: Iris
   umur: 12
   isWanita: benar
 - nama: Olivia
   umur: 5
   isWoman: benar
---