YAML 初学者简介

作为API开发的工程师,即便JSON是您常用的序列化工具,您也可能接触过YAML。

YAML拥有其独特的、简洁易读的语法,是一种值得加入您开发工具箱的便捷语言。

现在,让我们一起探索YAML的基础知识。

数据序列化的概念

当您需要在计算机网络(例如互联网)上传输数据结构或对象时,必须将其转换为特定的格式,以便能够读取和存储。这个过程通常被称为序列化,它在网络通信中至关重要。一个常见的应用案例是从数据库读取数据,并通过网络进行传输。

一些常见的序列化格式包括JSON、YAML和XML。

本文将着重介绍YAML。阅读完毕后,您将能够独立掌握YAML,并对其有清晰的认识。

YAML是什么?它有何优势?

YAML是一种数据序列化格式,其名称YAML Ain’t Markup Language,表明它不是一种标记语言。

YAML的主要优点在于其高可读性和易编写性。如果您需要处理对人类更加友好的配置文件,那么YAML将是理想的选择。虽然JSON和XML在各自领域仍然有其用武之地,YAML并非完全替代品,但是学习YAML仍然非常有用。

YAML的另一个优势是支持各种数据类型,例如布尔值、数组、字典、列表以及标量。它对包括JavaScript、Python、Ruby和Java等众多流行编程语言提供了良好的支持。

YAML仅支持空格,且区分大小写和空格。制表符通常不被接受。YAML文件的扩展名为.yaml。

YAML基本语法

每个YAML文档都以---开头,表示文件开始。

在API开发中,我们尤其关注YAML提供的映射功能。

以下是一个YAML映射示例:

---
name: James
boy: yes
GPA: 3.41

映射语法是key: value。注意,空格在YAML中非常重要,这与JSON或XML不同。

YAML还支持字符、字符串、整数、浮点数等基本数据类型,以及由基本数据类型构建的数组、列表等集合。

YAML中的数据类型

请看以下YAML示例:

---

MALE: FALSE

GPA: 3.61

ISSUES: NULL

NAME: “BIGYAN”

AGE: 16

第一个数据类型是布尔值,它只有两个值:truefalse。GPA的值是浮点数。YAML还支持空值,如示例中的“ISSUES”所示。“Name”的值是一个字符串,可以用双引号或单引号括起来。YAML还支持多行字符串,可以将多行文本视为单个字符串。

多行和单行字符串

---

About: >

 Hello this is Ryan

 From Alabama and I like to

 Play soccer.

>符号允许您将单行字符串分成多行。尽管文本有多行,但实际上它表示的是一个单行描述。

如果您使用 | 符号,也可以获得多行字符串,如下所示:

About: |

 This is a multiline string

 And will be printed line wise.

列表

列表在YAML中至关重要。

以下是一个列表的示例:

---

- apple

- banana

- mango

从标量到列表的映射如下所示,这在大多数配置文件中都非常重要。

---

Fruits:

 Apples

 Banana

 Guava 

将标量映射到列表需要嵌套。我们也可以使用多个嵌套列表,如下例所示:

Automobiles:

 Car:

     Hyundai

     Volkswagen

     Ford

在此例中,汽车嵌套在Automobiles内,而汽车品牌嵌套在Car内。这是一个多重嵌套的示例。您可以根据需要进行多次嵌套。

Subjects:

     Engineering:

       Mechanical engineering:

         Design and manufacture

         Automobile

         Control and Design

       Civil engineering:

         Structural engineering

         Hydropower

       Arts:

         Medieval

         Modern

         Painting

YAML还提供了&*符号,分别用作锚点和对锚点的引用,以避免重复。它们在Ruby on Rails等框架的配置文件中必不可少,可以减少YAML文件的大小。

请参考以下示例:

details: &details
    name: "John"
    age: 18
profession: engineer

<< : * details

这等效于:

profession: engineer

name: "John"

age: 18

在Python中使用YAML

Python对YAML提供了良好的支持,可以使用ruamelpyyaml等模块。首先,安装pyyaml:

pip install pyyaml

在本教程中,创建一个名为details.yaml的文件:

name: "john"

age:18

gender: male

另外创建一个名为feed.yaml的文件:

sports:

 football
 basketball
 cricket
 baseball

---
countries:
 Brazil
 Lithuania
 Australia
 USA

让我们先从读取details.yaml文件开始:

import yaml

with open('details.yaml') as f:
    
    data = yaml.load(f, Loader=yaml.FullLoader)
    print(data)

运行details.py文件后,输出如下:

 $ python details.py
{'name': "john", 'age': 18, 'gender': male}
import yaml

with open(r'feed.yaml') as file:
    # FullLoader参数用于处理从YAML标量值到Python字典格式的转换
    fruits_list = yaml.load(file, Loader=yaml.FullLoader)

    print(fruits_list)

使用Python将YAML写入文件

import yaml

dict_file = [{'sports' : ['hockey', 'rugby', 'tennis', 'ping pong', 'football', 'badminton']},
{'countries' : ['Jamaica', 'England', 'Nepal', 'Netherlands', 'South Africa', 'Bolivia', 'Portugal']}]

with open(r'E:data.yaml', 'w') as file: #创建新的yaml文件
    data = yaml.dump(dict_file, file)

在Node.js中实现YAML

Node.js是一种服务器端处理语言,数据序列化在开发过程中至关重要。

在本次教程中,考虑以下example.yaml文件:

name:John

age:18

Hobbies:

 Hobby1:Football

 Hobby2:BasketBall

 Hobby3:Hockey

Job:

-System administrator

-Programmer

有一个名为js-yaml的npm库可用于Node.js。首先,安装该模块:

npm install js-yaml

接下来,在文件中使用js-yaml模块:

const yaml = require('js-yaml'); //初始化js-yaml
const fs   = require('fs'); //初始化filestream

try {
  const result = yaml.load(fs.readFileSync('example.yml', 'utf8'));
  console.log(result);
} catch (e) {
  console.log(e); //捕获异常
}

总结

在现代编程框架和应用程序中,YAML在配置文件中的应用越来越广泛。YAML的设计目标与XML类似,旨在处理数据通信,但其语法更为精简。

您可以使用写入数据和YAML特定的打印命令为固定数据结构创建YAML文件。然而,专用的YAML发射器更适合转储各种复杂的分层数据。同样,使用正则表达式可以轻松解析基本的YAML文件(例如,键值对)。