欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

YAML-基础

最编程 2024-02-14 12:01:25
...

开篇

YAML是“ YAML不是标记语言”的缩写形式,是一种数据序列化语言,旨在对人类友好,并且可以与其他编程语言很好地配合日常工作。本教程详细介绍了一些重要的神经语言编程技能,可帮助您掌握销售技巧并说服潜在买家。

适合人群


本教程的目标读者包括使用JSON和XML文件进行配置设置的Web开发人员。任何打算以人类可读的结构化数据格式编写标记的程序员都可以学习YAML。

先决条件


本教程的先决条件包括HTML,XML和JSON的基本知识。YAML是专门为在常用情况下(例如配置文件,日志文件以及跨语言共享文件和数据共享)而设计的。

YAML-简介

YAML不是标记语言是一种数据序列化语言,可满足用户对数据的期望。它设计为对人类友好,并且可以与其他编程语言完美配合。管理数据非常有用,它包括Unicode可打印字符。本章将向您介绍YAML,并介绍其功能。

格式

考虑下面显示的文本-

Quick brown fox jumped over the lazy dog.
YAML文本将如下所示:

yaml.load(Quick brown fox jumped over the lazy dog.)
>>'Quick brown fox jumped over the lazy dog.'

请注意,YAML采用字符串格式的值,并且表示如上所述的输出。

例子

让我们借助以下示例了解YAML中的格式-

考虑以下点号“ pi”,其值为3.1415926。在YAML中,它表示为一个浮点数,如下所示-

>>> yaml.load('3.1415926536')
3.1415926536

假设要在特定的数据结构中加载多个值,如下所述-

eggs
ham
spam
French basil salmon terrine

当您将其加载到YAML中时,值将以列表形式的数组数据结构获取。输出如下所示-

>>> yaml.load('''
   - eggs
   - ham
   - spam
   - French basil salmon terrine
   ''')
['eggs', 'ham', 'spam', 'French basil salmon terrine']

特征

YAML包含一种具有重要结构的标记语言,以区分面向数据的语言和文档标记。YAML的设计目标和功能如下:

  • 匹配敏捷方法及其语言(例如Perl,Python,PHP,Ruby和JavaScript)的本机数据结构
  • YAML数据可在编程语言之间移植
  • 包括数据一致的数据模型
  • 易于人类阅读
  • 支持单向处理
  • 易于实施和使用

YAML-基础

现在您对YAML及其功能有了一个了解,让我们通过语法和其他操作学习其基础知识。请记住,YAML包含人类可读的结构化格式。

创建YAML文件的规则


在YAML中创建文件时,应记住以下基本规则-

  • YAML区分大小写

  • 文件应以.yaml为扩展名

  • YAML不允许在创建YAML文件时使用标签;允许使用空格代替

YAML文件的基本组件


YAML的基本组成如下:

常规块格式

此块格式使用连字符+空格在指定列表中开始一个新项目。观察下面显示的示例-

--- # Favorite movies
 - Casablanca
 - North by Northwest
 - The Man Who Wasn't There

内联格式

内联格式用逗号和空格分隔,并且项目包含在JSON中。观察下面显示的示例-

--- # Shopping list
   [milk, groceries, eggs, juice, fruits]

折叠文字

折叠文本将换行符转换为空格,并删除前导空格。观察下面显示的示例-

- {name: John Smith, age: 33}
- name: Mary Smith
  age: 27

遵循YAML的所有基本约定的结构如下所示-

men: [John Smith, Bill Jones]
women:
  - Mary Smith
  - Susan Williams

YAML基本元素简介


  • YAML基本元素的概要在此处给出:YAML中的注释以(#)字符开头。

  • 注释必须由空格与其他标记分隔。

  • 空格的缩进用于表示结构。

  • 不包含选项卡作为YAML文件的缩进。

  • 列表成员由前导连字符(-)表示。

  • 列表成员括在方括号中,并用逗号分隔。

  • 关联数组使用冒号(:)表示键值对的格式。它们用大括号{}括起来。

  • 具有单个流的多个文档用3个连字符(---)分隔。

  • 每个文件中重复的节点最初都以“&”号表示,之后再以星号(*)表示。

  • YAML始终要求将冒号和逗号用作列表分隔符,后跟带有标量值的空格。

  • 节点应标有感叹号(!)或双感叹号(!!),后跟可以扩展为URI或URL的字符串。

YAML-缩进和分离

学习任何编程语言时,缩进和分离是两个主要概念。本章详细讨论与YAML相关的这两个概念。

YAML缩进


YAML不包含任何强制性空格。此外,不需要保持一致。有效的YAML缩进如下所示-

a:
   b:
      - c
      -  d
      - e
f:
      "ghi"

在YAML中使用缩进时,您应该记住以下规则:流块必须与当前块级别周围至少有一些空格。

YAML的流内容跨越多行。流内容的开头以{或[开头。

阻止列表项包含与周围阻止级别相同的缩进,因为-被视为缩进的一部分。

意向示例


观察以下显示缩进示例的代码-

--- !clarkevans.com/^invoice
invoice: 34843
date   : 2001-01-23
bill-to: &id001
   given  : Chris
   family : Dumars
   address:
      lines: |
            458 Walkman Dr.
            Suite #292
      city    : Royal Oak
      state   : MI
      postal  : 48046
ship-to: *id001
product:
    - sku         : BL394D
      quantity    : 4
      description : Basketball
      price       : 450.00
   - sku         : BL4438H
      quantity    : 1
      description : Super Hoop
      price       : 2392.00
tax  : 251.42
total: 4443.52
comments: >
    Late afternoon is best.
    Backup contact is Nancy
    Billsmer @ 338-4338.

字符串分离


字符串之间用双引号引起来。如果在给定的字符串中对换行符进行转义,则将其完全删除并转换为空格值。


在此示例中,我们集中列出了具有字符串数据类型的数组结构形式的动物。列出的每个新元素都带有连字符前缀,如前所述。

-
 - Cat
 - Dog
 - Goldfish
-
 - Python
 - Lion
 - Tiger

下面提到了另一个说明YAML中的字符串表示形式的示例。

 errors:
      messages:
         already_confirmed: "was already confirmed, please try signing in"
         confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
         expired: "has expired, please request a new one"
         not_found: "not found"
         not_locked: "was not locked"
         not_saved:
            one: "1 error prohibited this %{resource} from being saved:"
            other: "%{count} errors prohibited this %{resource} from being saved:"

此示例引用了一组错误消息,用户只需提及关键方面即可使用该错误消息并相应地获取值。YAML的这种模式遵循JSON的结构,YAML的新用户可以理解。

YAML-注释

现在您已经熟悉了YAML的语法和基础知识,现在让我们进一步深入了解它的细节。在本章中,我们将看到如何在YAML中使用注释。

YAML支持单行注释。下面借助示例解释其结构-

# this is single line comment.

YAML不支持多行注释。如果要提供多行注释,可以按照下面的示例所示进行操作-

# this
# is a multiple
# line comment

注释功能


YAML中评论的功能如下-

  • 执行期间将跳过注释的块。

  • 注释有助于添加对指定代码块的描述。

  • 注释不能出现在标量中。

  • YAML不包含任何转义哈希符号(#)的方法,因此在多行字符串中,因此无法将注释与原始字符串值分开。

集合中的评论如下所示-

key: #comment 1
   - value line 1
   #comment 2
   - value line 2
   #comment 3
   - value line 3

意见征求YAML块的组合快捷键是CTRL + Q

如果您使用的是Sublime Text编辑器,则下面将介绍注释该块的步骤-

选择块。在Linux和Windows上使用“ CTRL + /”,在Mac操作系统上使用“ CMD + /”。执行块。

请注意,如果您使用的是Visual Studio代码编辑器,则这些步骤也适用。始终建议使用Sublime Text Editor创建大多数操作系统支持的YAML文件,并包括对开发人员友好的快捷键。

YAML-集合和结构

YAML包括使用缩进范围的块集合。在这里,每个条目都以新行开头。集合中的块序列用破折号和空格(-)表示每个条目。在YAML中,块集合样式不由任何特定指示符表示。YAML中的块收集可以通过标识其中包含的键值对来区别于其他标量。

映射是JSON结构中包含的键值的表示形式。它经常用于多语言支持系统中,并在移动应用程序中创建API。的映射,使用密钥值对表示与所述使用结肠和空间(:)。

例子
考虑一个标量序列的示例,例如,如下所示的球运动员列表-

- Mark Joseph
- James Stephen
- Ken Griffey

以下示例显示了将标量映射到标量-

hr: 87
avg: 0.298
rbi: 149

以下示例显示将标量映射到序列-

European:
- Boston Red Sox
- Detroit Tigers
- New York Yankees

national:
- New York Mets
- Chicago Cubs
- Atlanta Braves

集合可用于序列映射,如下所示:

-
name: Mark Joseph
hr: 87
avg: 0.278
-
name: James Stephen
hr: 63
avg: 0.288

对于集合,YAML包括使用显式指示符而不是使用缩进来表示空间的流样式。集合中的流程顺序用方括号括起来的逗号分隔列表表示。PHP框架(如Symphony)中包含的最佳收集插图。

[PHP, Perl, Python]

这些集合存储在文档中。YAML中的文档分隔用三个连字符或破折号(---)表示。文档末尾标有三个点(…)。

YAML中的文档分隔用三个破折号(---)表示。文档的末尾用三个点(…)表示。

文档表示形式称为结构格式,在下面提到-

# Ranking of 1998 home runs
---
- Mark Joseph
- James Stephen
- Ken Griffey 

# Team ranking
---
- Chicago Cubs
- St Louis Cardinals

带空格组合的问号表示结构上的映射复杂。在图块集合中,用户可以包括带有破折号,冒号和问号的结构。以下示例显示了序列之间的映射-

- 2001-07-23
? [ New York Yankees,Atlanta Braves ]
: [ 2001-07-02, 2001-08-12, 2001-08-14]

YAML-标量和标签

YAML中的标量使用表示为(|)的文字类型以块格式编写。它表示换行计数。在YAML中,标量以折叠样式(>)编写,其中每行表示一个以空行或更缩进的行结束的折叠空间。

保留在文字中的新行如下所示-

ASCII Art
--- |
\//||\/||
// || ||__

保留折叠的换行符,以便显示更多的缩进行和空白行,如下所示-

>
Sammy Sosa completed another
fine season with great stats.
63 Home Runs
0.288 Batting Average
What a year!

YAML流标量包括纯样式和引用样式。双引号样式包括各种转义序列。流标量可以包含多条线;在这种结构中,换行符总是折叠的。

plain:
This unquoted scalar
spans many lines.
quoted: "So does this
quoted scalar.\n"

在YAML中,未标记的节点是使用特定类型的应用程序指定的。标签规范的示例通常将seq,map和str类型用于YAML标签存储库。标签表示为示例,如下所述-

整数标签

这些标签中包含整数值。它们也称为数字标签。

canonical: 12345
decimal: +12,345
sexagecimal: 3:25:45
octal: 014
hexadecimal: 0xC

浮点数字

这些标记包括十进制和指数值。它们也称为指数标签。

canonical: 1.23015e+3
exponential: 12.3015e+02
sexagecimal: 20:30.15
fixed: 1,230.15
negative infinity: -.inf
not a number: .NaN

杂项标签

它包括各种嵌入其中的整数,浮点和字符串值。因此,它被称为杂项标签。

null: ~
true: y
false: n
string: '12345'

YAML-全长示例

下面的完整示例指定了YAML的构造,其中包括符号和各种表示形式,它们在以JSON格式转换或处理它们时将非常有用。这些属性在JSON文档中也称为键名。创建这些表示法是出于安全目的。

上面的YAML格式代表默认值,适配器和具有各种其他属性的主机的各种属性。YAML还保留每个生成文件的日志,以跟踪生成的错误消息。在将指定的YAML文件转换为JSON格式后,我们将获得所需的输出,如下所述-

defaults: &defaults
   adapter:  postgres
   host:     localhost

development:
   database: myapp_development
   <<: *defaults

test:
   database: myapp_test
   <<: *defaults

让我们将YAML转换为JSON格式并检查输出。

{
   "defaults": {
      "adapter": "postgres",
      "host": "localhost"
   },
   "development": {
      "database": "myapp_development",
      "adapter": "postgres",
      "host": "localhost"
   },
   "test": {
      "database": "myapp_test",
      "adapter": "postgres",
      "host": "localhost"
   }
}

包含默认前缀和前缀“ <<:*”,并且在需要时不需要重复编写相同的代码片段。

YAML-流程

YAML遵循标准流程流程。YAML中的本机数据结构包括简单的表示形式,例如节点。它也称为表示节点图。

它包括映射,序列和标量,将其序列化以创建序列树。通过序列化,对象将与字节流一起转换。

序列化事件树有助于创建字符流的表示形式,如下图所示。

反向过程将字节流解析为序列化的事件树。之后,将节点转换为节点图。这些值随后会在YAML本机数据结构中转换。下图解释了这一点-

YAML中的信息有两种使用方式:机器处理人工消耗。YAML中的处理器用作在上述图中互补视图之间转换信息的过程的工具。本章描述了YAML处理器必须在给定应用程序中提供的信息结构。

YAML包括用于以串行格式表示数据对象的序列化过程。YAML信息的处理包括三个阶段:表示,序列化,表示和解析。让我们详细讨论它们。

表示


YAML使用三种节点表示数据结构:序列,映射标量

序列


序列是指条目的有序数,它映射键值对的无序关联。它对应于Perl或Python数组列表。

下面显示的代码是序列表示的示例-

product:  - sku : BL394D
     quantity :  4 description :  Football price :  450.00  - sku : BL4438H
     quantity :  1 description :  Super  Hoop price :  2392.00

制图


另一方面,映射表示字典数据结构或哈希表。下面是一个相同的例子-

batchLimit: 1000
threadCountLimit: 2
key: value
keyMapping: <What goes here?>

标量


标量表示字符串,整数,日期和原子数据类型的标准值。请注意,YAML还包括指定数据类型结构的节点。有关标量的更多信息,请参阅本教程的第6章。

序列化


YAML中需要序列化过程,以简化人类友好的密钥顺序和锚点名称。序列化的结果是YAML序列化树。可以遍历它以生成一系列的YAML数据事件调用。

下面给出了序列化的示例-

consumer:
   class: 'AppBundle\Entity\consumer'
   attributes:
      filters: ['customer.search', 'customer.order', 'customer.boolean']
   collectionOperations:
      get:
         method: 'GET'
         normalization_context:
       groups: ['customer_list']
   itemOperations:
      get:
         method: 'GET'
         normalization_context:
            groups: ['customer_get']

介绍


YAML序列化的最终输出称为presentation。它以人类友好的方式表示字符流。YAML处理器包括用于创建流,处理缩进和格式化内容的各种演示细节。此完整过程由用户的偏好决定。

YAML表示过程的一个示例是创建JSON值的结果。观察下面给出的代码以更好地理解-

{
   "consumer": {
      "class": "AppBundle\\Entity\\consumer",
      "attributes": {
         "filters": [
            "customer.search",
            "customer.order",
            "customer.boolean"
         ]
      },
      "collectionOperations": {
         "get": {
            "method": "GET",
            "normalization_context": {
               "groups": [
                  "customer_list"
               ]
            }
         }
      },
      "itemOperations": {
         "get": {
            "method": "GET",
            "normalization_context": {
               "groups": [
                  "customer_get"
               ]
            }
         }
      }
   }
}

解析中


解析是表示的逆过程。它包括字符流并创建一系列事件。它丢弃表示过程中引入的导致序列化事件的详细信息。解析过程可能由于输入格式错误而失败。基本上,这是一个检查YAML格式是否正确的过程。

考虑下面提到的YAML示例-

---
   environment: production
   classes:
      nfs::server:
         exports:
            - /srv/share1
            - /srv/share3
   parameters:
      paramter1

它带有三个连字符,代表文档的开始,之后定义了各种属性。

YAML Lint是YAML的在线解析器,可帮助解析YAML结构以检查其是否有效。下面提到了YAML皮棉的官方链接:http : //www.yamllint.com/

您可以看到解析的输出,如下所示:

YAML皮棉

YAML-信息模型

本章将详细介绍上一章讨论的过程和过程。YAML中的信息模型将使用特定的图表以系统的格式指定序列化和表示过程的功能。

对于信息模型,代表在编程环境之间可移植的应用程序信息非常重要。

YAML信息模型

上面显示的图表示以图形格式表示的常规信息模型。在YAML中,本机数据的表示方法是扎根,连接的,并且是标记节点的有向图。如果我们提到有向图,它包括一组有向图的节点。如信息模型中所述,YAML支持三种节点,即-

  • 顺序
  • 标量
  • 对应

上一章讨论了这些表示节点的基本定义。在本章中,我们将重点介绍这些术语的示意图。以下序列图表示具有各种类型的标签和映射节点的图例的工作流程。

图例的序列图工作流程

节点分为三种:序列节点,标量节点映射节点

顺序

序列节点遵循顺序体系结构,包括零个或多个节点的有序序列。YAML序列可以重复包含同一节点,也可以包含一个节点。

标量

YAML中的标量内容包括Unicode字符,这些字符可以以一系列零表示的格式表示。通常,标量节点包括标量。

制图

映射节点包括键值对表示形式。映射节点的内容包括键值对与必须保持键名唯一的强制性条件的组合。序列和映射共同构成一个集合。

注意,如上图所示,标量,序列和映射以系统格式表示。

YAML-语法字符

各种类型的字符用于各种功能。本章详细讨论了YAML中使用的语法,并着重于字符操作。

指示符


指示符包括用于描述YAML文档内容的特殊语义。下表详细显示了此内容。

序号 特征与功能
1 _它表示一个块序列条目
2 ?它表示一个映射键
3 :它表示一个映射值
4 ,它表示流收集条目
5 [它启动流程
6 ]结束流程
7 {它启动流映射
8 }结束流映射
9 #它表示评论
10 &它表示节点的锚点属性
11 *它表示别名节点
12 !它表示节点的标签
13 | 它表示文字块标量
14 >它表示折叠块标量
15 `单引号包围引号流标量
16 ”双引号包围双引号流量标量
17 %它表示使用的指令

以下示例显示了语法中使用的字符-

%YAML 1.1
---
!!map {
   ? !!str "sequence"
   : !!seq [
      !!str "one", !!str "two"
   ],
   ? !!str "mapping"
   : !!map {
      ? !!str "sky" : !!str "blue",
      ? !!str "sea" : !!str "green",
   }
}

# This represents
# only comments.
---
!!map1 {
   ? !!str "anchored"
   : !local &A1 "value",
   ? !!str "alias"
   : *A1,
}
!!str "text"

YAML-语法原语

在本章中,您将学习YAML中语法原语的以下方面-

  • 生产参数
  • 缩进空间
  • 分隔空间
  • 忽略的行前缀
  • 折线

让我们详细了解每个方面。

生产参数


生产参数包括用于特定生产的一组参数和允许值的范围。以下生产参数列表在YAML中使用-

缩进

用字符nm表示。字符 流取决于其中包含的块的缩进级别。许多产品已将这些功能参数化。

语境

c表示。YAML支持两组上下文:块样式流样式

样式

用s表示。标量内容可以用以下五种样式之一表示:普通流,双引号和单引号流,文字和折叠式块。

t表示。块标量提供了许多有助于修剪块的机制:剥离,修剪保持。切碎有助于格式化新的行字符串。用于块样式表示。斩压过程在指标的帮助下发生。指示器控制应使用换行符产生什么输出。用(-)运算符删除换行符,并用(+)运算符添加换行符。

下图显示了一个斩压过程的示例-

strip: |-
   text↓
clip: |
   text↓
keep: |+
   text↓

解析指定的YAML示例后的输出如下-

缩进空间


在YAML字符流中,缩进定义为零个或多个字符的换行符。要记住的最重要的一点是,缩进一定不能包含任何制表符。缩进的字符永远不应被视为节点内容信息的一部分。观察以下代码以更好地理解-

%YAML 1.1
---
!!map {
   ? !!str "Not indented"
   : !!map {
      ? !!str "By one space"
      : !!str "By four\n spaces\n",
      ? !!str "Flow style"
      : !!seq [
         !!str "By two",
         !!str "Still by two",
         !!str "Again by two",
      ]
   }
}

缩进后可以看到的输出如下-

{
   "Not indented": {
      "By one space": "By four\n spaces\n", 
      "Flow style": [
         "By two", 
         "Still by two", 
         "Again by two"
      ]
   }
}

分隔空间


YAML使用空格字符来分隔标记。最重要的说明是,YAML中的分隔符不应包含制表符。

以下代码单独显示了分隔空间的用法-

{  · first:  ·  Sammy,  ·  last:  ·  Sosa  ·  }

上面显示的语法为您提供以下输出:

{
   "\u00b7 last": "\u00b7 Sosa \u00b7", 
   "\u00b7 first": "\u00b7 Sammy"
}

忽略的行前缀


空前缀始终根据标量类型包括缩进,其中也包括前导空格。普通标量不应包含任何制表符。另一方面,带引号的标量可能包含制表符。块标量完全取决于缩进。

以下示例以系统的方式显示了被忽略的行前缀的工作方式-

%YAML 1.1
---
!!map {
   ? !!str "plain"
   : !!str "text lines",
   ? !!str "quoted"
   : !!str "text lines",
   ? !!str "block"
   : !!str "text·®lines\n"
}

块流实现的输出如下-

{
   "plain": "text lines", 
   "quoted": "text lines", 
   "block": "text\u00b7\u00aelines\n"
}

折线


行折叠功能可以折断长行以提高可读性。短线越多意味着可读性越好。通过注意长行的原始语义来实现行折叠。以下示例演示了行折叠-

%YAML 1.1
--- !!str
"specific\L\
trimmed\n\n\n\
as space"

您可以看到JSON格式的行折叠的输出,如下所示:

"specific\u2028trimmed\n\n\nas space"

YAML-字符流

在YAML中,您会遇到各种字符流,如下所示-

  • 指令
  • 文件边界标记
  • 文件资料
  • 完整流
    在本章中,我们将详细讨论它们。

指令


指令是YAML处理器中使用的基本指令。指令是表示详细信息,例如注释,未反映在序列化树中。在YAML中,无法定义私有指令。本节通过相关示例讨论各种类型的指令-

保留指令

保留的指令使用三个连字符(---)初始化,如下例所示。保留的指令将转换为JSON的特定值。

%YAML 1.1
--- !!str
"foo"

YAML指令

YAML指令是默认指令。如果以JSON格式转换,则获取的值将在前面和结尾的字符中包含正斜杠字符。

%YAML 1.1
---
!!str "foo"

文件边界标记


YAML使用这些标记允许一个流中包含多个文档。这些标记专门用于传达YAML文档的结构。请注意,以“-”开头的行用于开始新文档。

以下代码通过示例解释了这一点-

%YAML 1.1
---
!!str "foo"
%YAML 1.1
---
!!str "bar"
%YAML 1.1
---
!!str "baz"

文件资料


YAML文档被视为呈现为单个根节点的单个本机数据结构。YAML文档中的演示文稿详细信息(例如指令,注释,缩进和样式)不被视为其中包含的内容。

YAML中使用两种类型的文档。他们在本节中解释-

明确文件

它从文档开始标记开始,然后是根节点的显示。下面给出了YAML显式声明的示例-

---

some: yaml

...

它包括一个明确的开始和结束标记,在给定的示例中为“ ---”和“ ...”。在将指定的YAML以JSON格式转换时,我们得到的输出如下所示-

{
   "some": "yaml"
}

隐性文件

这些文档不是以文档开始标记开头。遵守下面给出的代码-

fruits:
   - Apple
   - Orange
   - Pineapple
   - Mango

将这些值转换为JSON格式,我们得到的输出为简单的JSON对象,如下所示-

{
   "fruits": [
      "Apple",
      "Orange",
      "Pineapple",
      "Mango"
   ]
}

完整流


YAML包含称为字符流的字节序列。该流以包含表示字符编码的字节顺序的前缀开头。完整的流以包含字符编码的前缀开头,后跟注释。

完整流(字符流)的示例如下所示-

%YAML 1.1
---
!!str "Text content\n"

YAML-节点属性

每个表示节点都包括两个主要特征,分别称为anchor和tag。节点属性可以用节点内容指定,字符流中省略。

节点表示的基本示例如下-

%YAML 1.1
---
!!map {
   ? &A1 !!str "foo"
   : !!str "bar",
   ? !!str &A2 "baz"
   : *a1
}

节点锚


锚属性代表一个节点,以供将来参考。节点中YAML表示的字符流用&指示符表示。YAML处理器不需要保留锚名称,该锚名称中包含表示形式的详细信息。以下代码对此进行了解释-

%YAML 1.1
---
!!map {
   ? !!str "First occurence"
   : &A !!str "Value",
   ? !!str "Second occurence"
   : *A
}

用锚节点生成的YAML的输出如下所示-

---
!!map {
   ? !!str "First occurence"
   : !!str "Value",
   ? !!str "Second occurence"
   : !!str "Value",
}

节点标签


tag属性表示本机数据结构的类型,它完全定义了一个节点。标签用(!)指示符表示。标签被认为是表示图的固有部分。以下示例详细说明了节点标签-

%YAML 1.1
---
!!map {
   ? !<tag:yaml.org,2002:str> "foo"
   : !<!bar> "baz"
}

节点内容


节点内容可以以流内容或块格式表示。块内容延伸到行尾,并使用缩进来表示结构。每种收集类型都可以以特定的单个流收集样式表示,也可以视为单个块。以下代码对此进行了详细说明-

%YAML 1.1
---
!!map {
   ? !!str "foo"
   : !!str "bar baz"
}

%YAML 1.1
---
!!str "foo bar"

%YAML 1.1
---
!!str "foo bar"

%YAML 1.1
---
!!str "foo bar\n"

YAML-块标量头

在本章中,我们将重点介绍用于表示内容的各种标量类型。在YAML中,注释可以在标量内容之前或之后。重要的是要注意,注释不应包含在标量内容中。

请注意,所有流标量样式都可以包含多行,但在多个键中的用法除外。

标量的表示如下-

%YAML 1.1
---
!!map {
   ? !!str "simple key"
   : !!map {
      ? !!str "also simple"
      : !!str "value",
      ? !!str "not a simple key"
      : !!str "any value"
   }
}

块标量标头的生成输出如下所示-

{
   "simple key": {
      "not a simple key": "any value", 
      "also simple": "value"
   }
}

文档标记标量内容
此示例中的所有字符都被视为内容,包括内部空格字符。

%YAML 1.1
---
!!map {
   ? !!str "---"
   : !!str "foo",
   ? !!str "...",
   : !!str "bar"
}

%YAML 1.1
---
!!seq [
   !!str "---",
   !!str "...",
   !!map {
      ? !!str "---"
      : !!str "..."
   }
]

普通的换行符用下面给出的示例表示-

%YAML 1.1
---
!!str "as space \
trimmed\n\
specific\L\n\
none"

相应的JSON输出在下面提到-

"as space trimmed\nspecific\u2028\nnone"

YAML-流样式

可以将YAML中的流样式视为JSON的自然扩展,以覆盖折叠的内容行,以获得更好的可读性,该功能使用锚点和别名来创建对象实例。在本章中,我们将重点介绍以下概念的流程表示-

别名节点
空节点
流标量样式
流收集样式
流节点
别名节点的示例如下所示-

%YAML 1.2
---
!!map {
   ? !!str "First occurrence"
   : &A !!str "Foo",
   ? !!str "Override anchor"
   : &B !!str "Bar",
   ? !!str "Second occurrence"
   : *A,
   ? !!str "Reuse anchor"
   : *B,
}

上面给出的代码的JSON输出在下面给出-

{
   "First occurrence": "Foo", 
   "Second occurrence": "Foo", 
   "Override anchor": "Bar", 
   "Reuse anchor": "Bar"
}

内容为空的节点视为空节点。以下示例显示了这一点-

%YAML 1.2
---
!!map {
   ? !!str "foo" : !!str "",
   ? !!str "" : !!str "bar",
}

JSON中的空节点的输出表示如下-

{
   "": "bar", 
   "foo": ""
}

流标量样式包括双引号,单引号和普通类型。相同的基本示例如下-

%YAML 1.2
---
!!map {
   ? !!str "implicit block key"
   : !!seq [
      !!map {
         ? !!str "implicit flow key"
         : !!str "value",
      }
   ]  
}

上面给出的示例的JSON格式输出如下所示-

{
   "implicit block key": [
      {
         "implicit flow key": "value"
      }
   ] 
}

YAML中的流集合与另一个流集合中的块集合嵌套在一起。流收集条目以逗号(,)指示符终止。以下示例详细说明了流收集块-

%YAML 1.2
---
!!seq [
   !!seq [
      !!str "one",
      !!str "two",
   ],
   
   !!seq [
      !!str "three",
      !!str "four",
   ],
]

JSON中流收集的输出如下所示-

[
   [
      "one", 
      "two"
   ], 
   [
      "three", 
      "four"
   ]
]

JSON之类的流样式包括开始和结束指示符。没有任何属性的唯一流样式是普通标量。

%YAML 1.2
---
!!seq [
!!seq [ !!str "a", !!str "b" ],
!!map { ? !!str "a" : !!str "b" },
!!str "a",
!!str "b",
!!str "c",]

上面以JSON格式显示的代码的输出如下-

[
   [
      "a", 
      "b"
   ], 
   
   {
      "a": "b"
   }, 
   
   "a", 
   "b", 
   "c"
]

YAML-块样式

YAML包括两种块标量样式:文字折叠。块标量由少量指示符控制,其标题位于内容本身之前。下面给出了块标量头的示例-

%YAML 1.2
---
!!seq [
   !!str "literal\n",
   !!str "·folded\n",
   !!str "keep\n\n",
   !!str "·strip",
]

JSON格式的输出具有默认行为,如下所示-

[
   "literal\n", 
   "\u00b7folded\n", 
   "keep\n\n", 
   "\u00b7strip"
]

块样式的类型


块样式有四种类型:文字样式,折叠样式,保留样式和带状样式。这些块样式是在“块切碎”场景的帮助下定义的。下面是一个块斩断场景的例子-

%YAML 1.2
---
!!map {
   ? !!str "strip"
   : !!str "# text",
   ? !!str "clip"
   : !!str "# text\n",
   ? !!str "keep"
   : !!str "# text\n",
}

您可以看到以下三种格式的JSON生成的输出-

{
   "strip": "# text", 
   "clip": "# text\n", 
   "keep": "# text\n"
}

YAML中的切入控制最终的中断和结尾的空行,这些空行以各种形式进行解释。

剥离


在这种情况下,标量内容不包括最后的换行符和空行。它由砍伐指示器“-”指定。

剪裁


如果未指定显式斩断指示符,则将剪裁视为默认行为。最后的中断字符保留在标量的内容中。上面的示例演示了裁剪的最佳示例。它以换行符“ \ n”终止。

保持


保持是指以“ +”号表示的代表。创建的其他行不会折叠。额外的行不会折叠。

YAML-序列样式

要了解序列样式,了解集合很重要。集合和序列样式的概念并行工作。YAML中的集合用适当的序列样式表示。如果要引用标签的正确顺序,请始终引用集合。YAML中的集合由数组中表示的从零开始的连续整数索引。序列样式的重点始于集合。


让我们将宇宙中行星的数量视为可以作为集合创建的序列。以下代码显示了如何表示宇宙中行星的序列样式-

# Ordered sequence of nodes in YAML STRUCTURE
Block style: !!seq
- Mercury   # Rotates - no light/dark sides.
- Venus     # Deadliest. Aptly named.
- Earth     # Mostly dirt.
- Mars      # Seems empty.
- Jupiter   # The king.
- Saturn    # Pretty.
- Uranus    # Where the sun hardly shines.
- Neptune   # Boring. No rings.
- Pluto     # You call this a planet?
Flow style: !!seq [ Mercury, Venus, Earth, Mars,      # Rocks
                    Jupiter, Saturn, Uranus, Neptune, # Gas
                    Pluto ]                           # Overrated

然后,您可以看到以下输出以JSON格式显示有序序列-

{
   "Flow style": [
      "Mercury", 
      "Venus", 
      "Earth", 
      "Mars", 
      "Jupiter", 
      "Saturn", 
      "Uranus", 
      "Neptune", 
      "Pluto"
   ], 
   
   "Block style": [
      "Mercury", 
      "Venus", 
      "Earth", 
      "Mars", 
      "Jupiter", 
      "Saturn", 
      "Uranus", 
      "Neptune", 
      "Pluto"
   ]
}

YAML-流映射

YAML中的流映射表示键值对的无序集合。它们也称为映射节点。请注意,密钥应保持唯一。如果流映射结构中的键重复,则会生成错误。密钥顺序在序列化树中生成。


流映射结构的示例如下所示-

%YAML 1.1
paper:
   uuid: 8a8cbf60-e067-11e3-8b68-0800200c9a66
   name: On formally undecidable propositions of  Principia Mathematica and related systems I.
   author: Kurt Gödel.
tags:
   - tag:
      uuid: 98fb0d90-e067-11e3-8b68-0800200c9a66
      name: Mathematics
   - tag:
      uuid: 3f25f680-e068-11e3-8b68-0800200c9a66
      name: Logic

JSON格式的映射序列(无序列表)的输出如下所示:

{
   "paper": {
      "uuid": "8a8cbf60-e067-11e3-8b68-0800200c9a66",
      "name": "On formally undecidable propositions of Principia Mathematica and related systems I.",
      "author": "Kurt Gödel."
   },
   "tags": [
      {
         "tag": {
            "uuid": "98fb0d90-e067-11e3-8b68-0800200c9a66",
            "name": "Mathematics"
         }
      },
      {
         "tag": {
            "uuid": "3f25f680-e068-11e3-8b68-0800200c9a66",
            "name": "Logic"
         }
      }
   ]
}

如果您观察到如上所示的输出,则会发现在YAML映射结构中键名保持唯一。

YAML-块序列

YAML的块序列表示一系列节点。每个项目都由前导“-”指示符表示。请注意,YAML中的“-”指示符应与节点之间留有空格。

块序列的基本表示如下-

block sequence:
··- one↓
  - two : three↓


观察以下示例,以更好地理解块序列。

例子1

port: &ports
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  <<: *ports

JSON格式的块序列的输出如下-

{
   "port": {
      "adapter": "postgres",
      "host": "localhost"
   },
   "development": {
      "database": "myapp_development",
      "adapter": "postgres",
      "host": "localhost"
   }
}

YAML-故障安全模式

YAML架构被定义为标记集的组合,并且包括用于解析非特定标记的机制。YAML中的故障安全模式是以可以与任何YAML文档一起使用的方式创建的。它也被视为通用YAML文档的推荐架构。

种类


故障安全模式有两种:通用映射通用序列

通用映射


它代表一个关联容器。在此,每个键在关联中都是唯一的,并且恰好映射到一个值。YAML不包含键定义的限制。

下面给出了表示通用映射的示例-

Clark : Evans
Ingy : döt Net
Oren : Ben-Kiki
Flow style: !!map { Clark: Evans, Ingy: döt Net, Oren: Ben-Kiki }

JSON格式的通用映射结构的输出如下所示-

{
   "Oren": "Ben-Kiki", 
   "Ingy": "d\u00f6t Net", 
   "Clark": "Evans", 
   "Flow style": {
      "Oren": "Ben-Kiki", 
      "Ingy": "d\u00f6t Net", 
      "Clark": "Evans"
   }
}

通用序列


它代表一种序列。它包括一个以零开始的连续整数索引的集合。它用!! seq标签表示。

Clark : Evans
Ingy : döt Net
Oren : Ben-Kiki
Flow style: !!seq { Clark: Evans, Ingy: döt Net, Oren: Ben-Kiki }

此故障保险的一般序列的输出

schema is shown below:
{
   "Oren": "Ben-Kiki", 
   "Ingy": "d\u00f6t Net", 
   "Clark": "Evans", 
   "Flow style": {
      "Oren": "Ben-Kiki", 
      "Ingy": "d\u00f6t Net", 
      "Clark": "Evans"
   }
}

YAML-JSON模式

YAML中的JSON模式被认为是大多数现代计算机语言的共同点。它允许解析JSON文件。在YAML中强烈建议在JSON模式上考虑其他模式。这样做的主要原因是它包括用户友好的键值组合。消息可以被编码为密钥,并且可以在需要时使用。

JSON模式是标量的,缺少值。JSON模式中的映射条目以某些键和值对的格式表示,其中null被视为有效。


空JSON模式如下所示-

!!null null: value for null key
key with null value: !!null null

JSON表示的输出在下面提到-

{
   "null": "value for null key", 
   "key with null value": null
}


以下示例表示布尔JSON模式-

YAML is a superset of JSON: !!bool true
Pluto is a planet: !!bool false

以下是JSON格式的输出-

{
   "YAML is a superset of JSON": true, 
   "Pluto is a planet": false
}


以下示例表示整数JSON模式-

negative: !!int -12
zero: !!int 0
positive: !!int 34

整数生成的JSON模式的输出如下所示:

{
   "positive": 34, 
   "zero": 0, 
   "negative": -12
}


JSON模式中的标签由以下示例表示-

A null: null
Booleans: [ true, false ]
Integers: [ 0, -0, 3, -19 ]
Floats: [ 0., -0.0, 12e03, -2E+05 ]
Invalid: [ True, Null, 0o7, 0x3A, +12.3 ]

您可以找到JSON输出,如下所示-

{
   "Integers": [
      0, 
      0, 
      3, 
      -19
   ], 
   
   "Booleans": [
      true, 
      false
   ], 
   "A null": null, 

   "Invalid": [
         true, 
         null, 
         "0o7", 
         58, 
         12.300000000000001
   ], 
   
   "Floats": [
      0.0, 
      -0.0, 
      "12e03", 
      "-2E+05"
   ]
}