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
---
GO TO FULL VERSION