YAML được sử dụng để làm gì?

Một định dạng dữ liệu văn bản khác là YAML ( Yet Another Markup Language ; sau này là YAML Ain't Markup Language ). Nó được sử dụng để tuần tự hóa các đối tượng để truyền qua mạng (giống như XML và JSON được sử dụng theo cách này). Do con người có thể đọc được nên nó cũng được sử dụng để ghi các tệp cấu hình, chẳng hạn như cho Docker, Kubernetes, Ansible, v.v. Khi YAML cần được lưu vào một tệp (ví dụ: tệp cấu hình), chúng tôi sử dụng một trong hai phần mở rộng: .yaml hoặc .yml.

cú pháp ngôn ngữ

Trong XML, dấu ngoặc nhọn ( <> ) được sử dụng để chỉ định các thẻ. Trong JSON, chúng tôi sử dụng dấu ngoặc nhọn ( {} ). YAML sử dụng các dòng và thụt đầu dòng mới.

Dữ liệu được lưu trữ dưới dạng các cặp khóa-giá trị, trong đó khóa là một chuỗi và giá trị có thể là nhiều loại dữ liệu khác nhau (chuỗi, số, đúng/sai, mảng, v.v.). Các phím được viết không có dấu ngoặc kép.

Hãy xem cách thông tin được lưu trữ trong YAML:

Kiểu Java YAML
số nguyên
int number = 5
số 5
Số phân số
double number = 4.3
số: 4.3
biến Boolean
boolean valid = false
hợp lệ: sai
hợp lệ: không
hợp lệ: tắt

* Các giá trị boolean hợp lệ: đúng/sai, có/không, bật/tắt.

Sợi dây
String city = "New York"
thành phố: Thành phố New York
: Thành phố 'New York'
: "New York"

* Cả ba tùy chọn đều tương đương nhau.

Chuỗi có ký tự đặc biệt
String line = "aaa\nbbb"
dòng: "aaa\nbbb"
Nhận xét trong mã
// comment
# bình luận
Sự vật
public class Person {
  String name = "Dennis";
  int age = 32;
}

* Lớp của đối tượng được cung cấp để bạn có thể thấy cấu trúc của đối tượng.

người:
  tên: "Dennis"
  tuổi: 32

* Hãy chú ý đến thụt đầu dòng trước các thuộc tính. Nó phải giống nhau cho tất cả các thuộc tính.

Danh sách các giá trị đơn giản
var ages =
    List.of(1, 3, 5, 9, 78, -5);
tuổi: [1, 3,5,9,78, -5]
tuổi:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* Cả hai tùy chọn đều tương đương nhau.
** Mỗi phần tử của danh sách được đánh dấu bằng dấu gạch ngang.

Danh sách đối tượng
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)      );
người:
  - tên: "Ian"
    tuổi: 21
  - tên: "Marina"
    tuổi: 25
  - tên: "Owen"
    tuổi: 73

Như trong Java, một phần tử của danh sách có thể là một danh sách, nghĩa là các đối tượng có thể được lồng vào nhau. Dấu gạch nối cho biết phần tử tiếp theo của danh sách có thể được dịch chuyển theo chiều ngang so với khóa gốc hoặc nằm ngay bên dưới nó. Điều chính là tất cả các yếu tố có cùng định dạng. Điều này sẽ giúp tránh nhầm lẫn và hệ thống phân cấp lồng ghép không rõ ràng.

tuổi:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
tuổi:
- 1
- 3
- 5
- 9
- 78
- -5

Có hai sắc thái nữa khi làm việc với các giá trị văn bản:

  1. Văn bản nhiều dòng. Chúng ta có thể lưu văn bản như thế này:

    multilineText: "dòng 1\ndòng 2\n....dòng n"

    Nhưng sẽ rất khó chịu nếu cố đọc nó. Vì vậy, có | (ống), mà bạn có thể sử dụng để viết văn bản theo cách khác:

    nhiều dòngVăn bản: |
     dòng 1
     dòng 2
     ....
     dòng n

    Bạn sẽ đồng ý rằng tùy chọn thứ hai thuận tiện hơn, phải không?

  2. Xếp hàng dài. Nếu bạn muốn giữ văn bản trên một dòng nhưng cũng muốn nó vừa với không gian làm việc hiển thị của IDE, bạn có thể sử dụng ký hiệu > (lớn hơn).

    singlelineText: >
     bắt đầu
     ...
     tiếp tục dòng
     ...
     kết thúc

    Tất cả văn bản sẽ được coi là một dòng.

Nếu bạn cần viết nhiều cấu trúc dữ liệu YAML vào một tệp thì bạn cần tách chúng bằng --- (ba dấu gạch ngang). Trong thực tế, hiếm khi cần đến điều này, nhưng tốt nhất bạn nên biết về khả năng này.

Ví dụ về tài liệu YAML

Hãy tạo một số cấu trúc dữ liệu Java (một lớp) và một đối tượng tương ứng, đồng thời cố gắng biểu diễn đối tượng dưới dạng 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);
}

Đại diện hợp lệ trong YAML:

---
đám cướiNgày: 2000-12-03
vợ:
 tên: Ann
 tuổi: 37
 làNgười phụ nữ: có
chồng:
 tên: Alex
 tuổi: 40
 làNgười phụ nữ: không có
con:
 - tên: Iris
   tuổi: 12
   làNgười phụ nữ: đúng
 - tên: Olivia
   tuổi: 5
   làPhụ nữ: đúng
---