YML是什么
YAML(YAML Ain't Markup Language)是一种标记语言,通常以.yml或者.yaml为后缀的文件。它是一种直观的能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的。YAML可以用于如Java,C/C++, Ruby, Python, Perl, C#, PHP等编程语言。
YML的优点
- 易于人们阅读。
- 数据在编程语言之间是可移植的。
- 匹配敏捷语言的本机数据结构。
- 具有一致的模型来支持通用工具。
- 支持单程处理。
- 具有表现力和可扩展性。
- 易于实现和使用。
在Java中,可以通过支持YAML的库(如SnakeYAML,Jackson YAML等)将YAML文件解析为Java对象,或者将Java对象序列化为YAML文件。这对于配置文件,数据传输,对象序列化等场景非常有用。
YML语法
语法规则
YAML的基本语法规则如下:
- k: v 表示键值对关系,冒号后面必须有一个空格
- 使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的
- 大小写敏感
- '#'表示注释
- 缩进时不允许使用Tab键,只允许使用空格。
- 松散表示,Java中对于驼峰命名法,可用原名或使用-代替驼峰,如Java中的lastName属性,在YML中使用lastName或 last-name都可正确映射。
键值关系
(以Java语言为例,其它语言类似)对于键与值主要是看能否表示以下内容。普通的值(数字、字符串、布尔)、日期、对象、数组、集合等。
普通的值
k: v:字面量直接写;
字符串默认不用加上单引号或者双绰号;
“”: 双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
‘’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
age: 25
name: "John Doe"
is_alive: true
日期
date: 2023/08/30
对象(属性和值)、Map(键值对)
在下一行来写对象的属性和值的关系,注意缩进
address:
city: Anytown
state: CA
zip: 12345
行内写法:
address:{city: Anytown,state: CA,zip: 12345}
数组、list、set
用- 值表示数组中的一个元素
fruits:
- apple
- banana
- orange
行内写法:
fruits:{apple,banana,orange}
数组对象、list对象、set对象
peoples:
- name: zhangsan
age: 22
- name: lisi
age: 20
- {name: wangwu,age: 18}
Java代码示例
public class Person {
private String name;
private int age;
private List<String> hobbies;
public Person(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getHobbies() {
return hobbies;
}
public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
}
}
对应的YAML配置文件:
Person:
name: John Doe
age: 25
hobbies: [reading, sports, music]
在这个例子中,Java代码定义了一个名为Person的类,它有三个属性:name、age和hobbies。name是一个字符串,age是一个整数,hobbies是一个字符串列表。对应的YAML配置文件将Person对象的属性设置为指定的值。
文档块
在YAML中,文档块(document block)是一种将多个键值对组合在一起的数据结构。文档块以---(三个连字符)作为起始标记,以...(三个点)作为结束标记。在文档块内部,可以按照层级关系组织键值对。
以下是一个示例,展示了如何使用文档块:
---
name: John Doe
age: 25
---
name: Jane Doe
age: 30
在这个例子中,有两个文档块,每个文档块包含一个键值对。第一个文档块的键是name,值为John Doe;第二个文档块的键是age,值为25。第二个文档块后面还有一个额外的---标记,表示文档块的结束。
文档块可以嵌套,以构建更复杂的数据结构。例如,可以将一个文档块嵌套在另一个文档块中:
person:
name: John Doe
age: 25
address:
street: 123 Main St.
city: Anytown
state: CA
zip: 12345
在这个例子中,person是一个文档块,包含三个键值对。其中,address是一个嵌套的文档块,包含四个键值对。通过这种方式,可以构建具有多个层级的数据结构。
实例:
server:
port: 8081
spring:
profiles:
active: "prod" # 激活对应的文档块
---
server:
port: 8083
spring:
profiles: "dev" # 指定属于哪个环境
---
server:
port: 8084
spring:
profiles: "prod" # 指定属于哪个环境
配置文件中有三个文档块(或称为“块”),每个块都包含有关服务器和Spring配置的信息。
第一个文档块中,服务器端口被设置为8081,并且激活的Spring配置文件是“prod”。
第二个文档块中,服务器端口被设置为8083,并且指定的Spring配置文件属于“dev”环境。
第三个文档块中,服务器端口被设置为8084,并且指定的Spring配置文件属于“prod”环境。