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 |
---|---|---|
整數 |
|
數量:5
|
分數 |
|
數量:4.3
|
布爾變量 |
|
有效:假
有效:無 有效:關閉 * 有效的布爾值:真/假、是/否、開/關。 |
細繩 |
|
城市:紐約
市:“紐約” 城市:“紐約” * 所有三個選項都是等價的。 |
帶有特殊字符的字符串 |
|
行:“aaa\nbbb”
|
在代碼中註釋 |
|
# 評論
|
目的 |
* 給出了對象的類,因此您可以看到對象的結構。 |
人物:
姓名:“丹尼斯” 年齡:32 * 注意屬性前的縮進。所有屬性都必須相同。 |
簡單值列表 |
|
年齡:[1, 3,5,9,78, -5]
年齡: - 1 - 3 - 5 - 9 - 78 - -5 * 兩個選項是等價的。 |
對象列表 |
|
人:
- 姓名:“Ian” 年齡:21 - 姓名:“Marina” 年齡:25 - 姓名:“Owen” 年齡:73 |
與在 Java 中一樣,列表的一個元素可以是一個列表,也就是說,對象可以相互嵌套。指示列表下一個元素的連字符可以相對於父鍵水平偏移,或直接位於其下方。最主要的是所有元素都具有相同的格式。這將有助於避免混淆和不明確的嵌套層次結構。
年齡:
- 1 - 3 - 5 - 9 - 78 - -5 |
年齡:
- 1 - 3 - 5 - 9 - 78 - -5 |
使用文本值時還有兩個細微差別:
-
多行文本。我們可以這樣保存文本:
multilineText: "第 1 行\n第 2 行\n....第 n 行"但是嘗試閱讀它會非常不愉快。所以有| (管道)符號,您可以使用它以不同的方式編寫文本:
多行文本: |
第 1 行
第 2 行
....
第 n 行您會同意第二種選擇更方便,對嗎?
-
排長龍。如果您希望將文本保留在一行中,但又希望它適合 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
---