作为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
第一个数据类型是布尔值,它只有两个值:true
或false
。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提供了良好的支持,可以使用ruamel
和pyyaml
等模块。首先,安装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文件(例如,键值对)。