YAML简介
1 YAML特点
YAML(YAML Ain’t Markup Language)是一个可读性高,用来表达数据序列化的格式。
- YAML在视觉上更容易看,避开了各种封闭符号(引号,各种括号)
- 在YAML文件中嵌入其他序列化格式(json或xml)更为强大,json的语法结构和YAML的内置格式相同
- YAML能够使用“锚点”引用YAML文件中的其他项目。
从长远来看,YAML是一种更强大和可行的数据序列化格式
2 适用场景
- 脚本语言:由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用
- 序列化:因为它是宿主语言数据类型直转的
- 配置文件:
3 基础语法
3.1 基本规则
- 大小写敏感
- 使用缩进表示层级关系
- 禁止使用tab缩进,只能使用空格键
- 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级
- 使用#表示注释
- 字符串可以不用引号标注
3.2 三种数据结构
3.2.1 map,散列表
使用冒号(:)表示键值对,
# YAML 表示
log_level: 0
cpu_flag: 0
# 对应的Json表示
{
"log_level": 0,
"cpu_flag": 0,
}
也可以写在一行:
# YAML 表示
{log_level: 0,cpu_flag: 0}
# 对应的Json表示
{
"log_level": 0,"cpu_flag": 0,
}
3.2.2 list 数组
使用连字符(-)表示:
# YAML表示
-
parser
-
analyser
-
kpu_exe
-
hardware
# 也可以写在一行
[parser,analyser,kpu_exe,hardware]
# 对应Json表示
[
"parser",
"analyser",
"kpu_exe",
"hardware"
]
# 也可以写在一行
["parser","analyser","kpu_exe","hardware"]
3.2.3 纯量
最基本的、不可再分的值
- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间
- 日期
3.3 数据结构嵌套
3.3.1 map嵌套map
# YAML表示
server_conf:
socket_conf:
source_ip: 0.0.0.0
source_port: 8181
max_link: 65536
thread_num: 2
# Json 表示
{
"socket_conf": {
"source_ip": "0.0.0.0",
"source_port": 8181,
"max_link": 65536,
"thread_num": 2
}
}
3.3.2 map嵌套list
# YAML表示
module:
-
parser
-
analyser
-
kpu_exe
-
hardware
# 对应Json表示
{"module": ["parser","analyser","kpu_exe","hardware"]}
3.3.3 list嵌套list
# YAML表示
-
- Ruby
- Perl
- Python
-
- c
- c++
- java
# 对应Json表示
[ [ 'Ruby', 'Perl', 'Python' ], [ 'c', 'c++', 'java' ] ]
3.3.4 list嵌套map
# YAML表示
data_source:
-
uid: sa
pwd: 2018Ystech
data_source_name: doe_unit_test
use_tables_flag: 0
table_names:[]
-
uid: sa
pwd: 2018Ystech
data_source_name: doe_test2
use_tables_flag: 0
table_names:[]
3.4 使用锚点
user:
host: 127.0.0.1
db: 8
book:
host: 127.0.0.1
db: 9
comment:
host: 127.0.0.1
db: 10
通过使用锚点和引用的功能
localhost: &localhost1
host: 127.0.0.1
user:
<<: *localhost1
db: 8
book:
<<: *localhost1
db: 9
comment:
<<: *localhost1
db: 10
其中&表示将localhost1作为localhost的别名,* 标识取别名localhost1对应的value,<<表示将*localhost1代表的map
合并入当前map数据。
4 C++中使用yaml-cpp读写yaml配置文件
4.1 使用方法
- yaml-cpp是一个开源库,github上可下载,yaml-cpp。通过CMake来进行构建和编译。
- 将头文件和生成的lib库引入到项目中。
4.2 示例
对于如下一个yaml文件config.yml:
server_conf:
log_path_conf_windows: C:/Log/
log_path_conf_linux: /home/Log/
log_level: 0
backup_kpu_num: 0
c++示例代码
#include <iostream>
#include "include/yaml-cpp/yaml.h"
using namespace std;
int main()
{
YAML::Node config = YAML::LoadFile("../config.yml");
cout << "windows_log_path: " << config["server_conf"]["log_path_conf_windows"].as<string>() << endl;
cout << "linux_log_path: " << config["server_conf"]["log_path_conf_linux"].as<string>() << endl;
cout << "log_level: " << config["server_conf"]["log_level"].as<int>() << endl;
cout << "backup_kpu_num: " << config["server_conf"]["backup_kpu_num"].as<int>() << endl;
return 0;
}
运行结果