如果您是编写 API 的开发人员,即使您的主要序列化工具可能是 JSON,您也可能遇到过 YAML。
YAML 有自己的友好语法,是一种可以添加到您的开发工具库中的便捷语言。
让我们学习 YAML 的基础知识。
目录
数据序列化
每当你想通过计算机网络(比如 Internet)发送一些数据结构或对象时,你必须将它转换成一种特殊格式才能读取和存储它。 这个过程通常被称为序列化,在网络上非常重要。 序列化的一个常见用法示例是从数据库读取数据并通过网络传输数据。
一些序列化格式包括 JSON、YAML、XML。
在这篇文章中,我们讨论了 YAML,在文章的最后,您将能够按照自己的方式学习 YAML,并且对 YAML 有一个清晰的介绍。
什么是 YAML,它对我有什么好处?
YAML 是一种数据序列化格式,代表 YAML 不是标记语言。
使用 YAML 的主要优点是可读性和可写性。 如果您有一个需要更易于人类阅读的配置文件,最好使用 YAML。 YAML 并不是 JSON 的完全替代品,因为 JSON 和 XML 也有它们的位置; 尽管如此,学习 YAML 还是很有用的。
YAML 的另一个好处是它支持各种数据类型,例如案例、数组、字典、列表和标量。 它对最流行的语言有很好的支持,如 JavaScript、Python、Ruby、Java 等。
YAML 只支持空格,并且区分大小写和空格。 制表符不被普遍接受。 YAML 文件的扩展名为 .yaml。
基本 YAML 语法
每个 YAML 都以 — 开头,表示 YAML 文件的开头。
创建 API 时,我们对 YAML 提供的称为映射的功能感兴趣。
以下示例显示了 YAML 中映射的示例。
--- name: James boy: yes GPA: 3.41
映射语法是key:value。 (注意空格,与 JSON 或 XML 不同,它在 YAML 中非常重要。
YAML 还支持字符、字符串、整数、浮点值等数据类型,以及由基本数据类型构造的数组、列表等集合。
YAML 中的数据类型
让我们看看下面的 YAML 示例:
--- MALE: FALSE GPA: 3.61 ISSUES: NULL NAME: “BIGYAN” AGE: 16
第一种数据类型是布尔值,它可以有两个值:true 或 false。 GPA 的值是浮点数。 YAML 还支持空数据类型,就像我们在“问题”中所使用的那样。 “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
在这里,汽车嵌套在汽车内部,现代汽车嵌套在汽车内部。 这是一个多重嵌套的例子。 我们可以根据需要进行多次嵌套。
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 文件更小。
请参阅下面的示例
<span class="hljs-attr">details:</span> <span class="hljs-meta">&details</span> <span class="hljs-attr">name:</span> <span class="hljs-string">"John" </span> age: 18
profession: engineer << : * details
这相当于:
profession: engineer name: "John" age: 18
Python 中的 YAML
Python 支持 YAML,包括一些模块,如 ruamel 和 pyyaml。 首先安装pyyaml
pip 安装 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: # The FullLoader parameter handles the conversion from YAML # scalar values to Python the dictionary format 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: #create a new yaml file 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
我们有一个可用于 Node.js 的 npm 库,称为 js-yaml. 让我们从安装模块开始
npm install js-yaml
然后我们在我们的文件中使用 js-yaml 模块。
const yaml = require('js-yaml'); //initialize js-yaml const fs = require('fs'); //initialize filestream try { const result = yaml.load(fs.readFileSync('example.yml', 'utf8')); console.log(result); } catch (e) { console.log(e); //catch exception }
结论
在存储或分发数据的现代编程框架和应用程序中,YAML 在配置文件中变得越来越普遍。 YAML 的目标是许多与可扩展标记语言 (XML) 相同的通信应用程序,但它有一个有意与 XML 不同的最小语法。
可以使用写入数据和 YAML 特定装饰的打印命令为固定数据结构创建 YAML 文件。 但是,专用 YAML 发射器更适合转储各种或复杂的分层数据。 类似地,使用正则表达式,可以轻松解析基本的 YAML 文件(例如,键值对)。