yaml数组解析_YAML详解

1   YAML简介

YAML,即YAML Ain’t Markup Language的缩写,YAML 是一种简洁的非标记语言。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。

YAML的在线Demo这个YAML转化JSON网页中进行上手练习

2   YAML语法

大小写敏感

使用缩进表示层级关系

禁止使用tab缩进,只能使用空格键

缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级。

使用#表示注释

字符串可以不用引号标注

3   YAML 组织结构

YAML 文件可以由一或多个文档组成(也即相对独立的组织结构组成),文档间使用“---”(三个横线)在每文档开始作为分隔符。同时,文档也可以使用“...”(三个点号)作为结束符(可选)。如果只是单个文档,分隔符“---”可省略。

4   YAML数据结构

YAML 支持的数据结构有三种:

对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

纯量(scalars):单个的、不可再分的值

4.1    对象

4.1.1        使用 “:”(冒号) + 空格表示单个键值对

对象的一组键值对,使用 “:”(冒号) + 空格表示单个键值对,格式为key: value。冒号后面要加一个空格

key: value

可以使用缩进表示层级关系;

key:

child-key: value

child-key2: value2

key: {child-key: value, child-key2: value2}

4.1.2        使用"{}"表示一个键值表

items: {no: 1234, descript: cpu, price: ¥800.00}

4.1.3        "? " 问号+空格表示复杂的键

"? " 问号+空格表示复杂的键。当键是一个列表或键值表时,就需要使用本符号来标记。

# 使用一个列表作为键

? [blue, reg, green]: Color

# 等价于

? - blue

- reg

- gree

: Color

4.2

数组

使用一个短横线加一个空格代表一个数组项:

hobby:

- Java

- LOL

当然也可以有这样的写法:

-

- Java

- LOL

可以简单理解为:[[Java,LOL]]

数组的理解:

PaymentDetail:

- billPaymentNo: "201904171022507929513877465876"

- paymentAmount: 1000.00

- paymentMethod1: "ODD"

- paymentSuccessDate: 2019-04-17 13:00:00

转为json如下:

PaymentDetail:[{billPaymentNo: '201904171022507929513877465876' },{paymentAmount: 1000 },{paymentMethod1: 'ODD' },{paymentSuccessDate: Wed Apr 17 2019 21:00:00 GMT+0800 (China Standard Time)}]

理解为:PaymentDetail值为一个列表,列表中有四个元素,其中每个元素都是一个字典,每个字典中只有一个键值对

PaymentDetail1:

- billPaymentNo: "201904171022507929513877465876"

paymentAmount: 1000.00

paymentMethod1: "ODD"

paymentSuccessDate: 2019-04-17 13:00:00

转为json如下:

PaymentDetail1: [{billPaymentNo:'201904171022507929513877465876',paymentAmount: 1000, paymentMethod1: 'ODD',paymentSuccessDate: Wed Apr 17 2019 21:00:00 GMT+0800 (China Standard Time)}]

理解为:PaymentDetail1值为一个列表,列表中只有一个元素,该元素为一个字典,字典由多个键值对构成

4.3

复合结构

对象和数组可以结合使用,形成复合结构。

2. languages:

- Ruby

- Perl

- Python

6. websites:

YAML: yaml.org

Ruby: ruby-lang.org

Python: python.org

Perl: use.perl.org

转为 JavaScript 如下。

{ languages: [ 'Ruby', 'Perl', 'Python' ],

websites:

{ YAML: 'yaml.org',

Ruby: 'ruby-lang.org',

Python: 'python.org',

Perl: 'use.perl.org' } }

4.4

纯量

纯量是最基本的、不可再分的值。以下数据类型都属于纯量:

l

字符串

l

布尔值

l

整数

l

浮点数

l

Null

l

时间

l

日期

4.5

特殊用法

4.5.1

!! YAML中使用!!做类型强行转换:

yamlbeans包一般用!(单叹号)做类型转换,snakeyaml包一般用!!(双叹号)做类型转换

string:

- !!str 54321

- !!str true

相当于把数字和布尔类型强转为字符串。当然允许转型的类型很多,比如:

--- !!set

- Mark McGwire: 65

- Sammy Sosa: 63

- Sammy Sosa: 63

- Ken Griffy: 58

将数组解析为set,转化的内容就是:[{Ken Griffy=58}, {Mark McGwire=65}, {Sammy Sosa=63}],重复的Sammy Sosa去掉;

4.5.2        字符串默认不使用引号表示。

str: 这是一行字符串

4.5.3        字符串之中包含空格或特殊字符,需要放在引号之中

如果字符串之中包含空格或特殊字符,需要放在引号之中。单引号和双引号都可以使用

str: '内容: 字符串'

4.5.4        双引号不会对特殊字符转义。

s1: '内容\n字符串'

s2: "内容\n字符串"

4.5.5        单引号之中如果还有单引号,必须连续使用两个单引号转义。

str: 'labor''s day'

4.5.6        多行字符串可以使用|保留换行符,也可以使用>折叠换行。

this: |

Foo

Bar

that: >

Foo

Bar

转为 JavaScript 代码如下:

{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }

4.5.7        +表示保留文字块末尾的换行,-表示删除字符串末尾的换行。

s1: |

Foo

s2: |+

Foo

s3: |-

Foo

转为 JavaScript 代码如下。

{ s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }

4.5.8        布尔值用true和false表示。

NULL用~表示。

4.5.9        锚点&和别名*,可以用来引用,定义数据的复用

第一步:使用 “&” 定义数据锚点(即要复制的数据)

第二步:使用 “*” 引用上述锚点数据(即数据的复制目的地)

2. defaults: &defaults

adapter:  postgres

host:     localhost

6. development:

database: myapp_development

<<:>

test:

database: myapp_test

<<:>

等同于下面的代码。

2. defaults:

adapter:  postgres

host:     localhost

6. development:

database: myapp_development

adapter:  postgres

host:     localhost

test:

database: myapp_test

adapter:  postgres

host:     localhost

&用来建立锚点(defaults),<

下面是另一个例子。

2. - &showell Steve

3. - Clark

4. - Brian

5. - Oren

6. - *showell

转为 JavaScript 代码如下。

[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,YAML 中的多级数组可以通过让数组中的每个元素再包含一个数组来表示。例如: ``` - element1 - element2 - - subelement1 - subelement2 - subelement3 - element3 ``` 这样就表示了一个多级数组,第三个元素是一个包含了三个子元素的数组。 在代码中,你可以通过遍历数组来访问这个多级数组的每一个元素。例如: ```python import yaml data = yaml.load(""" - element1 - element2 - - subelement1 - subelement2 - subelement3 - element3 """, Loader=yaml.FullLoader) for element in data: if isinstance(element, list): for subelement in element: print(subelement) else: print(element) ``` 这段代码会输出这个多级数组中的所有元素,如果某个元素是一个数组,就会遍历这个数组中的所有子元素。 ### 回答2: c 语言中可以使用 yaml-cpp 库来解析多级数组。该库是一个 C++ 实现的开源库,用于读取和写入 YAML 格式的文件。 使用 yaml-cpp 库来解析多级数组,需要先安装该库并包含相关的头文件。首先,创建一个 YAML 文档对象。然后,使用该对象的方法来读取 YAML 文件中的数据。 在 YAML 文件中,多级数组可以表示为嵌套的列表或映射。例如,以下是一个包含多级数组YAML 文件示例: ```yaml - [1, 2, 3] - [4, 5, 6] - [7, 8, 9] ``` 在 C++ 中,你可以使用 yaml-cpp 库来解析上述 YAML 文件: ```cpp #include <yaml-cpp/yaml.h> #include <iostream> int main() { YAML::Node doc = YAML::LoadFile("example.yaml"); // 遍历多级数组 for (const auto& array : doc) { for (const auto& element : array) { std::cout << element.as<int>() << " "; } std::cout << std::endl; } return 0; } ``` 运行上述代码,将会输出如下结果: ``` 1 2 3 4 5 6 7 8 9 ``` 上述代码中,`YAML::LoadFile()` 方法用于从 YAML 文件中加载数据并返回一个 YAML::Node 对象。通过遍历该 Node 对象,可以依次访问多级数组中的元素,并使用 `as<int>()` 方法将元素转换为整数类型并输出。 这样,就可以使用 yaml-cpp 库来解析和处理多级数组YAML 数据了。 ### 回答3: c语言中要解析多级数组yaml文件,可以使用yaml-cpp库来实现。yaml-cpp是一个C++的库,提供了对yaml文件的解析和生成功能。 首先,需要下载并安装yaml-cpp库。安装完成后,可以通过以下代码来解析多级数组yaml文件: ```c++ #include <iostream> #include <yaml-cpp/yaml.h> int main() { YAML::Node config = YAML::LoadFile("config.yaml"); // 读取多级数组 if (config["array"]) { YAML::Node array = config["array"]; for (int i = 0; i < array.size(); i++) { for (int j = 0; j < array[i].size(); j++) { std::cout << "array[" << i << "][" << j << "]: " << array[i][j].as<int>() << std::endl; } } } return 0; } ``` 在上面的代码中,首先通过`YAML::LoadFile`函数将yaml文件加载为一个YAML::Node对象,然后通过索引访问多级数组中的具体元素。 需要注意的是,yaml文件中的数组可以有不同的数据类型,因此需要根据实际情况使用`as`函数来将节点转换为正确的数据类型。 以上就是使用c语言解析多级数组yaml文件的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值