JavaRush /Kurslar /All lectures for AZ purposes /YAML Məlumat Formatı

YAML Məlumat Formatı

All lectures for AZ purposes
Səviyyə , Dərs
Mövcuddur

YAML Nə Üçün İstifadə Olunur

Daha bir mətn məlumat formatı — YAML (Yet Another Markup Language, sonradan — YAML Ain't Markup Language). Obyektlərin şəbəkə vasitəsilə ötürülməsi üçün serializasiya edilməsində istifadə olunur (xml və json kimi). Oxunma rahatlığı səbəbindən, həmçinin konfiqurasiya fayllarının yazılması üçün də istifadə olunur, məsələn, Docker, Kubernetes, Ansible və s. YAML faylda saxlanılmalıdırsa (məsələn, konfiqurasiya), o zaman iki genişlənmə istifadə olunur: .yaml və .yml.

Dilin Sintaksisi

Xml-də teqləri göstərmək üçün bucaq mötərizələri (<>) istifadə olunur, JSON üçün isə köşə mötərizələri ({}). YAML üçün isə sətir ayracı (Enter) və mesafələr (boşluqlar ya da tab) istifadə olunur.

Məlumatlar key-value cütləri şəklində saxlanılır, burada açar bir sətirdir, dəyər isə müxtəlif məlumat tipləri ola bilər: sətir, rəqəm, doğru/yanlış, massiv... Açarlar dırnaqsız yazılır.

Gəlin ardıcıl olaraq YAML-da məlumatların necə saxlandığını baxaq:

Tip Java YAML
Tam ədədlər

int number = 5
number: 5
Ədədi kəsr

double number = 4.3
number: 4.3
Boolean dəyişəni

boolean valid = false
valid: false
valid: no
valid: off

* İcazə verilən boolean dəyərlər: true/false, yes/no, on/off.

Sətir

String city = “Kyiv”
city: Kyiv
city: 'Kyiv'
city: "Kyiv"

* Hər üç variant bərabərdir.

Xüsusi simvollarla sətir

String line = “aaa\nbbb”
line: "aaa\nbbb"
Kodda şərh

// comment
# comment
Obyekt

public class Person {
  String name = “Vasyl”;
  int age = 32;
}

* Obyektin strukturunu göstərmək üçün sinif gətirilmişdir.

person:
name: "Vasyl"
age: 32

* Attributların önündəki mesafəyə diqqət yetir. Bütün atributlar üçün eyni olmalıdır.

Sadalama dəyərləri

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

* Hər iki variant bərabərdir.
** Siyahının hər növbəti elementi defis ilə qeyd olunur.

Obyektlər siyahısı

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("Ivan", 21) ,     
        new Person("Marina", 25) ,     
        new Person("Oleh", 73)      );
people:
- name: "Ivan"
age: 21
- name: "Marina"
age: 25
- name: "Oleh"
age: 73

Java da olduğu kimi, siyahının elementi başqa siyahı ola bilər, yəni obyektlər bir-birinin içinə yerləşdirilə bilər. Siyahının növbəti elementini müəyyən edən defis üfüqi olaraq əsas açarın yanında və ya onun altında ola bilər. Əsas olanı — bütün elementlərin eyni formatda olmasıdır. Bu çaşqınlığın və iç-içəlik iyerarxiyasının qeyri-müəyyənliyinin qarşısını alacaq.

ages:
- 1
- 3
- 5
- 9
- 78
- -5
ages:
- 1
- 3
- 5
- 9
- 78
- -5

Mətn dəyərləri ilə işləyərkən daha iki nüans var:

  1. Çok sətirli mətn. Mətn bu şəkildə saxlanıla bilər:

    multilineText: "line 1\nline 2\n....line n"

    Amma oxumaq çox rahat olmayacaq. Ona görə də | (pipe) simvolu var, bununla mətn başqa cür yazıla bilər:

    multilineText: |
    line 1
    line 2
    ....
    line n

    Razılaş, ikinci variant daha rahatdır, hə?

  2. Uzun sətirlər. Əgər mətn bir sətirdə saxlanılmalıdır, amma proqramın işçi sahəsində tam görünməsini istəyirsənsə, > (greater) simvolundan istifadə edə bilərsən.

    singlelineText: >
    begin
    ...
    continue same line
    ...
    end

    Bütün mətn bir sətir kimi qəbul olunacaq.

Əgər bir neçə YAML data strukturunu bir fayla yazmaq lazım olarsa, onlardan arasında (üç defis) ayırıcı istifadə edilməlidir. Əməliyyat praktikada nadir hallarda rast gəlinir, amma bu variant haqqında bilmək yaxşıdır.

YAML Sənədi Nümunəsi

Java-da hansısa data strukturu (sinif) və bu tip obyekt yaradaq — və bu obyektin məlumatlarını YAML formatında serializasiya olunmuş şəkildə təsvir etməyə cəhd edək.


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("Anya", 37, true);
   Person husband = new Person("Alex", 40, false);
   var children = List.of(
           new Person("Inna", 12, true),
           new Person("Olya", 5, true)
   );
   Date weddingDate = new Date(/*some long*/);

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

YAML-də doğru təmsil olunması:

---
weddingDate: 2000-12-03
wife:
name: Anya
age: 37
isWoman: yes
husband:
name: Alex
age: 40
isWoman: no
children:
- name: Inna
age: 12
isWoman: true
- name: Olya
age: 5
isWoman: true
---
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION