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
---