L o a d i n g . . .
SHIWIVI-文章

//sunny forever
while(life<end){
love++;
beAwesome :)}

    <
  • 主题:
  • + -
  • 清除背景
  • 禁用背景

yaml语法

字数:3545 写于:2022-07-14
最新更新:2022-07-14 阅读本文预计花费您11分钟
YAML官方文档:YAML 1.2.2

简介

关于

YAML是一种数据序列化语言,可用于存储和传输数据,常用于编写配置文件、数据文件、日志文件,以及跨语言进行数据共享等环境,大多数编程语言都可以使用 YAML 进行数据序列化。

YAML文件后缀为.yml.yaml

基本语法

1. 通常使用键值对形式

  • 键与值通常不需要引号包裹 (这点与json不同)
  • 值可以为:数组、对象、标量值
  • 标量值是指:整数、浮点数、字符串、布尔值、Null、时间、日期

2. 通过缩进或者样式流表示数据结构

  • 数据可以通过空格缩进来表示层级关系,但不能用制表符(Tab)
  • 子结构相较父结构必须缩进至少一个空格,同一级数据须缩进相同空格数,即左端对齐
  • 也可以使用花括号{ },中括号[ ]等样式流表示层级关系
    3. 大小写敏感
    4. 使用#号注释

对象

最为常用的数据类型,又称为字典、哈希、映射,以 key:  value 键值对的形式存储数据,key: 后需要有空格!

对象写法

name: JayChou album: 十一月的萧邦

或者使用样式流:

{ name: JayChou, album: 十一月的萧邦 }
等同于json格式下的
{ "name": "JayChou", "album": "十一月的萧邦" }

缩进与嵌套

可以通过缩进至少一个空格表示层级关系,从而嵌套其他对象、数组等

student: name: aaa age: 16 hobby: - basketball - swimming
多级嵌套时,每层嵌套都应当缩进,且每个子元素左边应该缩进相等的空格数,即左端对齐
使用样式流:
student: { name: aaa, age: 16, hobby: [ basketball , swimming ] }

复杂对象格式

使用?加空格可以指定多个key值,使用:加空格指定多个value

? - key1 - key2 : - value1 - value2
表示key是一个数组,值也是一个数组,样式流:
key1,key2: ["value1","value2"]

数组

使用-开头表示数组元素

数组写法

- value1 - value2 - value3
样式流:
[value1,value2,value3]

缩进与嵌套

可以通过缩进表示层级关系,来嵌套数组、对象等

- name: 周杰伦, age: 42, songs: - 夜曲 - 米兰的小铁匠 - name: 林肯公园, age: 41, songs: - In the End - Numb
样式流
[ { name: 周杰伦, age: 42, songs: [ 夜曲 , 米兰的小铁匠 ] }, { name: 林肯公园, age: 41, songs: [ In the End , Numb ] } ]

标量

标量指最基本的,不可再分的值,这里指:整数、浮点数、字符串、布尔值、Null、时间、日期

基本使用方法:

1. 整数可以为非十进制数 num1: 120 #普通十进制数 num2: 0b10_1011 #二进制以0b开头 num3: 07100 #八进制以0开头 num4: 0xf1ab #十六进制以0x开头 2. 浮点数可以使用科学计数法 float1: 3.14 float2: 3.1415926e+5 #科学计数法314159.26 float3: -.inf #负无穷大 flota4: .nan #不是数字 3. 布尔值大小写均可 bool: true 值为:true、True、TRUE均可,但TRUe将被解析为字符串 4. Null可用~表示 data: ~ 5. 日期必须使用ISO 8601格式,即yyyy-MM-dd date: 2021-07-15 6. 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区 time: 2021-07-15T00:42:31+08:00 在JavaScript中解析为Thu Jul 15 2021 00:42:31 GMT+0800 (中国标准时间) 7. 使用!!数据类型 值进行类型转换 date: !!str 2021-01-15

字符串处理

一般情况下,字符串不需要添加引号,但如果字符串中间包含特殊字符,尤其是冒号加空格组合时,为了避免被yaml解析为键值对,需要添加引号

str: 'said: meet you like wind'

给数值等标量添加引号将解析为字符串

str: '99.99'

多行字符串,第二行开始所有行需要缩进至少一个空格,但解析时将被解析为一行字符串,且换行符会被替换为空格

str: aaaa bbbb cccc 将被解析为 str: "aaaa bbbb cccc"

单引号与双引号

单引号和双引号均可以用于包裹字符串

  • 单引号会原样输出,将转义字符作为普通字符串输出
  • 双引号会转义字符串,如将 \n 转义为换行
如: content: '不会\n换行' 内容输出为: 不会\n换行 content: "进行\n换行" 内容输出为: 进行 换行

区块字符串处理

  1. 多行字符串可以使用|保留所有换行符,内容从第二行开始需要缩进至少一个空格,且最后一行的换行符也会保留。

    lyrics: | aaaa bbbb cccc dddd
    输出为:
    aaaa bbbb cccc dddd
  2. 可以使用>去除换行,换行符将被空格代替 (如果某一行是空行,该空行会被额外保留)

    lyrics: > aaaa bbbb cccc dddd
    输出为:
    aaaa bbbb cccc dddd
  3. 可以使用+保留文字块末尾的换行

    lyrics: |+ aaaa bbbb cccc dddd
    输出为:
    aaaa bbbb cccc dddd
  4. 可以使用-去除文字块末尾的换行

    lyrics: |- aaaa bbbb cccc dddd
    输出为:
    aaaa bbbb cccc dddd
    在yml文件中配置好字符串格式后,读取到html中时往往需要添加如white-space: pre-line;等css属性来保留换行符和空格,否则读入的数据可能会被css默认样式去除换行符,从而无法展示原生yml指定的数据格式
  5. 在样式流中,无法使用 | > + -
    如:以上数据写为样式流 { lyrics: |- aaaa bbbb cccc dddd } |- 将无法解析,抛出错误

添加HTML标签

yaml允许在值中添加HTML标签,并且标签会被正确地解析为DOM

- tag: web content: 推荐网站<a href='SHIWIVI'>SHIWIVI</a>
- tag: web content: |- 推荐 网站<a href='SHIWIVI'>SHIWIVI</a>
解析为:
推荐网站 SHIWIVI
使用时需要注意,插入的HTML标签是否会被其他语言解析为字符串,但yaml本身是可以输出为DOM元素的

锚点与引用

可以使用&定义一个锚点,然后使用*引用锚点

first: &anchor #定义锚点 - aaa - bbb second: *anchor #调用锚点
解析为
first: [aaaaa,bbb] second: [aaaaa,bbb]

如果将多个键值对引用到其他地方,可以使用<<合并数据

first: &data #定义锚点 name: lol age: 18 hobby: - sing - swing second: <<: *data #将数据插入此处 address: zzz
解析为:
{ "first": { "name": "lol", "age": 18, "hobby": "sing swimming" }, "second": { "name": "lol", "age": 18, "hobby": "sing swimming", "address": "zzz" } }
如果多次定义了同名的锚点(重定义),则先定义的锚点会被覆盖

文件格式

一个完整的yml文档以-‌-‌-标识文档开始,以标识文档结束,该标识非必须,无标识的称为裸文档,文件开头可以添加%YAML来识别文件的YAML版本

%YAML 1.2 # 开头注释,注明文档作者等信息 --- ip: 45.77.77.49 port: 443 ...

一个yml文件中可能有多个文档

--- ip: 45.77.77.10 port: 80 ... --- ip: 45.77.77.11 port: 443 ...
但如果在一个yml文件中写入多个文档,在某些环境下读入可能报错,需要分割为多个文件
err: YAMLException: expected a single document in the stream, but found more
更多语法和拓展详见官方文档
上一篇:路由与路由守卫
下一篇:Grid栅格布局
z z z z z