目录
官网地址:The Official YAML Web Site
一、什么是YAML
YAML(YAML Ain't Markup Language)是一种轻量级的标记语言,用于表示数据的序列化格式。YAML 的设计目标是提供一种易读且容易写的数据格式,同时具有清晰的结构。它通常用于配置文件、数据交换、配置管理和其他需要人类可读性的应用场景。
person:
name: John Doe
age: 30
address:
street: 123 Main St
city: Anytown
state: CA
在上面的示例中,person 是一个映射(字典),包含 name、age 和 address 三个字段。address 字段又是一个嵌套的映射,包含 street、city 和 state 三个字段。
二、YAML的语法
1、缩进
YAML 使用空格来表示数据结构的层次结构,而不使用大括号或其他分隔符。缩进的空格数通常是 2 或 4 个,但必须一致使用。缩进表示嵌套关系。
parent:
child:
grandchild: value
2、键值对
键值对使用冒号分隔,键和值之间可以有一个或多个空格。键通常是字符串,但也可以是非字符串标量。
key: value
3、注释
注释以 # 开头,可以出现在行的任何位置,但必须以 # 开头。
# 这是一个注释
key: value # 这也是注释
4、列表
列表使用 - 符号表示,后跟一个空格。列表项可以是任何数据类型,包括字符串、数字、字典等。
items:
- item1
- item2
- item3
5、字典(映射)
字典或映射使用 key: value 形式表示,其中 key 是键,value 可以是任何数据类型,包括字符串、数字、嵌套字典等。
person:
name: John Doe
age: 30
6、多行字符串
YAML 支持多行字符串,可以使用 | 或 > 字符来表示。| 保留换行符,> 将多行字符串转换为单行,但保留了换行符。
description: |
This is a
multiline
string.
7、折叠文本块
使用 > 符号可以将多行文本块转换为单行,并在保留换行符的同时删除开头的空格。
description: >
This is a
folded
text block.
8、引号
YAML 中的字符串可以使用单引号 ' 或双引号 " 包裹,但不是必需的,除非字符串包含特殊字符。双引号内的字符串支持转义字符。
single_quoted: 'This is a single-quoted string'
double_quoted: "This is a double-quoted string with a newline:\nHello"
9、特殊值
YAML 支持几个特殊值,包括布尔值(true 和 false)、空值(null 或 ~)和不可用值(undefined)。
boolean_values:
- true
- false
null_value: null
三、YAML高级特性
1、锚点和引用(配套使用)
(1)锚点(Anchor):锚点是一种用于标记 YAML 文档中特定部分的标签。你可以使用 & 后跟锚点名称来创建锚点。
(2)引用(Alias):引用是用 * 后跟锚点名称来引用锚点的值。引用允许你在不重复键值对的情况下多次使用相同的值。
person: &details
name: John Doe
age: 30
employee1: *details
employee2: *details
在上面的示例中,&details 创建了一个名为 details 的锚点,然后 *details 引用了 details 锚点,用于创建多个相同的键值对。也就是employee1、employee2下属的值与person相同。
2、自定义数据类型(自定义类型一般都要自定义解析器)
YAML 支持自定义标签,允许你指定如何解释特定的数据类型。你可以使用 ! 后跟标签名称来指定自定义数据类型。
date: !date 2023-09-12
在上面的示例中,!date 是一个自定义标签,表示日期类型,后面的值 2023-09-12 是日期的实际值。解析 YAML 时,你可以使用自定义的解析器来处理这个类型。
3、包含其他文件
YAML 允许你在一个文件中包含其他文件,这对于组织复杂的配置或数据非常有用。你可以使用 !include 标签指定要包含的文件。
第一个YAML文件为main.yaml
# main.yaml
included_data: !include included.yaml
另一个文件为included.yaml
# included.yaml
some_data:
- item1
- item2
在上面的示例中,main.yaml 包含了 included.yaml 文件中的数据。解析 YAML 时,可以将这两个文件合并处理。
注意:在使用高级特性时,需要编写或使用相应的解析器来正确处理锚点和引用、自定义数据类型以及包含其他文件。不同的编程语言和库提供不同的支持和方式来处理这些特性。因此,具体的实现方式取决于你使用的编程语言和库。
四、合并多配置文件
将不同配置文件放一个ymal中,使用“ --- ”分割。
server:
port: 8881
spring:
profiles:
active:
- prod
---
spring:
profiles: test
server:
port: 8882
test:
name: app
desc: ${server.port} is run
---
spring:
profiles: dev
server:
port: 8082
---
spring:
profiles: prod
server:
port: 8083
五、Spring中的高级配置
1、随机数
有些特殊需求,如不希望设置的属性值是一个固定值,可以使用${radom}在配置中产生随机int,long或是string。
${random.int()} = 随机int
${random.long} = 随机long
${random.int(50)} = 50以内的随机数
${random.int(50,100)} = 50~100之间的int随机数
${random.value}= 随机字符串
yaml配置文件中的写法:
com.yiqifu.test1=${random.int(50,100)}
com.yiqifu.test2=${random.value}