YAML Data Formati

All lectures for UZ purposes
Daraja, Dars
Mavjud

YAML nima uchun ishlatiladi

Yana bir matnli ma'lumot formati — YAML (Yet Another Markup Language, keyinchalik — YAML Ain't Markup Language). Ob'ektlarni tarmoq orqali uzatish uchun serializatsiya qilish uchun ishlatiladi (xml va json singari). O'qilishi qulayligi tufayli uni konfiguratsiya fayllarini yozishda ham ishlatishadi, masalan, Docker, Kubernetes, Ansible, etc. YAML ni faylda saqlash kerak bo'lsa (masalan, konfiguratsion), ikkita kengaytma ishlatiladi: .yaml va .yml.

Til sintaksisi

Xml'dagi teglarni belgilash uchun burchakli qavslardan (<>), JSON'da esa figurali qavslardan ({}) foydalaniladi. YAML uchun esa satr ajratgichi (Enter) va bo'shliqlar (probel yoki tab) ishlatiladi.

Ma'lumotlar key-value juftliklari ko'rinishida saqlanadi, bu key string bo'lib, qiymat turli ma'lumotlar turi bo'lishi mumkin: string, raqam, true/false, array... Kalitlar tirnoqsiz yoziladi.

YAML'da ma'lumotlar qanday saqlanishini ketma-ket ko'rib chiqamiz:

Tur Java YAML
Butun son

int number = 5
number: 5
O'nlik son

double number = 4.3
number: 4.3
Boolean o'zgaruvchi

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

* Ruxsat etilgan boolean qiymatlar: true/false, yes/no, on/off.

String

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

* Uchala variant ham tengdir.

Maxsus belgili string

String line = “aaa\nbbb”
line: "aaa\nbbb"
Koddagi izoh

// comment
# comment
Ob'ekt

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

* Ob'ektni ko'rsatish uchun, ob'ektning tuzilishi aniq bo'lishi uchun sinf keltirilgan.

person:
  name: "Vasyl"
  age: 32

* Atributlar oldidagi bo'shliqqa e'tibor bering. U barcha atributlar uchun bir xil bo'lishi kerak.

Sodda qiymatlar ro'yxati

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

* Ikkala variant ham teng.
** Ro'yxatning har bir keyingi elementining oldida defis belgisi qo'yiladi.

Ob'ektlar ro'yxati

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'dagi kabi, ro'yxat elementi ham ro'yxat bo'lishi mumkin, ya'ni ob'ektlarni bir biriga joylashtirish mumkin. Ro'yxatdagi keyingi elementni aniqlovchi defis, asosiy kalitga nisbatan gorizontal o'zgartirilishi mumkin yoki bevosita uning ostida bo'lishi mumkin. Muhimi, barcha elementlar bir xil formatga ega bo'lishi kerak. Bu chalkashlik va kengaytirilgan iyerarxiyaga sabab bo'lishini oldini oladi.

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

Matnli qiymatlar bilan ishlashda yana ikkita noziklik mavjud:

  1. Ko'p qatorli matn. Biz matnni quyidagicha saqlashimiz mumkin:

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

    Lekin uni o'qish juda noqulay bo'ladi. Shuning uchun | (pipe) belgisi mavjud, yordamida matnni boshqacha yozib qo'yish mumkin:

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

    Qabul qilasizmi, ikkinchi variant qulayroq, to'g'rimi?

  2. Uzun satrlar. Agar matnni bitta satrda saqlash kerak bo'lsa, lekin uni IDE ishchi oynasida joylashishini xohlasangiz, > (greater) belgisidan foydalanishingiz mumkin.

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

    Barcha matn bitta satr sifatida qabul qilinadi.

Agar bir necha YAML tuzilmalarni bir faylda yozish kerak bo'lsa, ularning orasida ajratgich — (uchta defis) ishlatiladi. Amalda bu kamdan-kam hollarda kerak bo'lib qoladi, lekin bu variantni bilish foydali bo'ladi.

YAML hujjati misoli

Java'da qandaydir ma'lumot tuzilmasi (klass) va shu turdagi ob'ekt yarataylik — va bu ob'ektning ma'lumotlarini YAML formatida serializatsiya qilingan holda tasvirlashga harakat qilamiz.


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'da yaroqli tasvirlanishi:

---
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
---
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION