YAML 的用途是什麼?

另一種文本數據格式是 YAML(Yet Another Markup Language;後來,YAML Ain't Markup Language)。它用於序列化對像以通過網絡傳輸(就像 XML 和 JSON 以這種方式使用一樣)。因為它是人類可讀的,它也被用來​​編寫配置文件,例如,用於 Docker、Kubernetes、Ansible 等。當 YAML 需要保存到文件(例如,配置文件)時,我們使用以下兩種之一擴展名:.yaml 或 .yml。

語言句法

在 XML 中,尖括號 ( <> ) 用於指定標記。在 JSON 中,我們使用大括號 ( {} )。YAML 使用新行和縮進。

數據以鍵值對的形式存儲,其中鍵是字符串,值可以是各種數據類型(字符串、數字、true/false、數組等)。鍵不帶引號。

我們來看看 YAML 中是如何存儲信息的:

類型 爪哇 YAML
整數
int number = 5
數量:5
分數
double number = 4.3
數量:4.3
布爾變量
boolean valid = false
有效:假
有效:無
有效:關閉

* 有效的布爾值:真/假、是/否、開/關。

細繩
String city = "New York"
城市:紐約
市:“紐約”
城市:“紐約”

* 所有三個選項都是等價的。

帶有特殊字符的字符串
String line = "aaa\nbbb"
行:“aaa\nbbb”
在代碼中註釋
// comment
# 評論
目的
public class Person {
  String name = "Dennis";
  int age = 32;
}

* 給出了對象的類,因此您可以看到對象的結構。

人物:
  姓名:“丹尼斯”
  年齡:32

* 注意屬性前的縮進。所有屬性都必須相同。

簡單值列表
var ages =
    List.of(1, 3, 5, 9, 78, -5);
年齡:[1, 3,5,9,78, -5]
年齡:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* 兩個選項是等價的。
** 列表中的每個元素都用連字符標記。

對象列表
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)      );
人:
  - 姓名:“Ian”
    年齡:21
  - 姓名:“Marina”
    年齡:25
  - 姓名:“Owen”
    年齡:73

與在 Java 中一樣,列表的一個元素可以是一個列表,也就是說,對象可以相互嵌套。指示列表下一個元素的連字符可以相對於父鍵水平偏移,或直接位於其下方。最主要的是所有元素都具有相同的格式。這將有助於避免混淆和不明確的嵌套層次結構。

年齡:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
年齡:
- 1
- 3
- 5
- 9
- 78
- -5

使用文本值時還有兩個細微差別:

  1. 多行文本。我們可以這樣保存文本:

    multilineText: "第 1 行\n第 2 行\n....第 n 行"

    但是嘗試閱讀它會非常不愉快。所以有| (管道)符號,您可以使用它以不同的方式編寫文本:

    多行文本: |
     第 1 行
     第 2 行
     ....
     第 n 行

    您會同意第二種選擇更方便,對嗎?

  2. 排長龍。如果您希望將文本保留在一行中,但又希望它適合 IDE 的可見工作區,您可以使用 > 大於)符號。

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

    所有文本將被視為一行。

如果您需要將多個 YAML 數據結構寫入一個文件,那麼您需要用---(三個連字符)將它們分隔開。實際上,很少需要這樣做,但最好意識到這種可能性。

YAML 文檔示例

讓我們創建一些 Java 數據結構(一個類)和一個相應的對象,並嘗試將對象表示為 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);
}

YAML 中的有效表示:

---
婚禮日期:2000-12-03
妻子:
 姓名:Ann
 年齡:37
 女:是 丈夫

 姓名:Alex
 年齡:40
 女:無
孩子:
 - 姓名:Iris
   年齡:12
   女:真
 - 姓名:Olivia
   年齡: 5
   isWoman: true
---