当前位置:   article > 正文

YAML基本语法及在c++中的应用_c++ yaml

c++ yaml

1 YAML特点

YAML(YAML Ain’t Markup Language)是一个可读性高,用来表达数据序列化的格式。

  • YAML在视觉上更容易看,避开了各种封闭符号(引号,各种括号)
  • 在YAML文件中嵌入其他序列化格式(json或xml)更为强大,json的语法结构和YAML的内置格式相同
  • YAML能够使用“锚点”引用YAML文件中的其他项目。

从长远来看,YAML是一种更强大和可行的数据序列化格式

2 适用场景

  • 脚本语言:由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用
  • 序列化:因为它是宿主语言数据类型直转的
  • 配置文件:

3 基础语法

3.1 基本规则

  1. 大小写敏感
  2. 使用缩进表示层级关系
  3. 禁止使用tab缩进,只能使用空格键
  4. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级
  5. 使用#表示注释
  6. 字符串可以不用引号标注

3.2 三种数据结构

3.2.1 map,散列表

使用冒号(:)表示键值对,

# YAML 表示
 log_level: 0
 cpu_flag: 0


# 对应的Json表示
{
"log_level": 0,
"cpu_flag": 0,
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

也可以写在一行:

# YAML 表示
 {log_level: 0,cpu_flag: 0}

# 对应的Json表示
{
"log_level": 0,"cpu_flag": 0,
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3.3.2 map嵌套list

# YAML表示
 module:
 -
  parser 
 -
  analyser
 -
  kpu_exe
 -
  hardware

# 对应Json表示
{"module": ["parser","analyser","kpu_exe","hardware"]}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.3.3 list嵌套list

# YAML表示
-
  - Ruby
  - Perl
  - Python 
- 
  - c
  - c++
  - java

# 对应Json表示
[ [ 'Ruby', 'Perl', 'Python' ], [ 'c', 'c++', 'java' ] ]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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:[]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

通过使用锚点和引用的功能

localhost: &localhost1
    host: 127.0.0.1
user:
    <<: *localhost1
    db: 8

book:
    <<: *localhost1
    db: 9

comment:
    <<: *localhost1
    db: 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

其中&表示将localhost1作为localhost的别名,* 标识取别名localhost1对应的value,<<表示将*localhost1代表的map
合并入当前map数据。

4 C++中使用yaml-cpp读写yaml配置文件

4.1 使用方法

  1. yaml-cpp是一个开源库,github上可下载,yaml-cpp。通过CMake来进行构建和编译。
  2. 将头文件和生成的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
  • 1
  • 2
  • 3
  • 4
  • 5

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

运行结果
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/274743
推荐阅读
相关标签
  

闽ICP备14008679号