Skip to content

YAML – 处理过程

YAML 促进了数据在其人类可读的文本格式与编程语言使用的原生数据结构之间的转换。无论您是将应用程序数据转换为 YAML(序列化 / 呈现)还是将 YAML 文本转换回应用程序数据(解析 / 表示),这个过程都包含几个关键阶段。

大致流程可以可视化如下:

从应用程序数据到 YAML 文本:

  1. 应用程序的原生数据结构(例如,Python、Java、JavaScript 中的对象、数组、列表、字典)。
  2. YAML 表示(节点图):原生数据被转换为一个抽象的内部 YAML 模型,该模型由节点(标量、序列、映射)组成,通常称为节点图或表示图。
  3. 序列化(事件流):处理节点图以生成一个抽象的 YAML 事件流(例如,‘start sequence’(开始序列)、‘scalar value’(标量值)、‘end mapping’(结束映射))。
  4. 呈现(字符流):然后将这些事件格式化为最终的人类可读的 YAML 文本,包括缩进、注释和样式选择。

从 YAML 文本到应用程序数据:

  1. YAML 字符流(输入:.yaml 或 .yml 文件内容)。
  2. 解析(事件流):读取 YAML 文本并解析为 YAML 事件流,同时验证语法。
  3. YAML 表示(节点图):这些事件用于在内存中构建抽象的 YAML 节点图。
  4. 重构为原生数据结构:然后将节点图转换回编程语言的原生数据类型。

YAML 处理器(各种编程语言中的库)负责处理这些转换。让我们看看关键阶段:

YAML 的核心是使用三种基本节点类型表示数据:

表示有序的项目集合,相当于数组或列表。示例:

tasks:
- sku: BL394D
description: Football
quantity: 4
- sku: BL4438H
description: Super Hoop
quantity: 1

表示无序的键值对集合,类似于字典、散列表或对象。键必须唯一。示例:

database_config:
host: localhost
port: 5432
user: admin

表示单个、原子性的数据值,如字符串、数字(整型、浮点数)、布尔值、空值、日期等。示例:BL394D、4、localhost、5432、true。

序列化是将应用程序的内存中数据结构(即 YAML 表示/节点图)转换为 YAML 事件流的过程,该事件流最终生成文本格式的 YAML。这个阶段会考虑键的顺序(尽管映射本质上是无序的,但一些序列化器会保留插入顺序以提高可读性)以及解析锚点/别名。

例如,一个 Python 字典可以被序列化为一个 YAML 映射:

# Python 字典(概念性)
# my_data = {'name': 'MyApp', 'version': '1.0', 'settings': {'debug': True, 'port': 8080}}
# 序列化后的 YAML 输出
name: MyApp
version: '1.0'
settings:
debug: true
port: 8080

呈现是生成 YAML 字符流(实际文本文件)的最后阶段。YAML 处理器会决定格式化细节,例如缩进宽度、集合是使用块式风格还是流式风格、如何引用标量以及如果表示中包含注释则将注释放在哪里。用户偏好通常可以指导这个过程。

输出是人类可读的 YAML,如上面所示的示例。如果目标是 JSON,呈现将遵循 JSON 语法。

解析是序列化和呈现的逆过程。它接收 YAML 字符流作为输入,并执行词法和语法分析,以确保其根据 YAML 规范格式良好。如果发现错误(例如,缩进不一致、语法违规),解析器将报告它们。成功的解析会生成一个事件流,然后使用该事件流在内存中构建 YAML 表示(节点图)。

考虑以下 YAML 输入:

---
environment: production
application_nodes:
- id: app_server_01
role: web_api
- id: db_server_01
role: database
parameters:
max_connections: 100

YAML 解析器读取并验证此内容,并允许应用程序访问 environment(作为 ‘production’)、application_nodes(作为对象列表)等。

可以使用像 YAML Lint 这样的在线工具(例如,可通过 yamllint.com 等网站访问或集成到 IDE 中)来解析和验证 YAML 文档。这些工具检查语法正确性,并有助于在使用 YAML 之前发现问题。许多代码编辑器和 IDE 也提供实时 YAML 验证。

理解这些过程有助于有效地使用 YAML 进行配置、数据交换,并了解 YAML 库的底层工作原理。