YAML基本语法入门

  • 随着软件开发的需要,接触到了许多的配置文件都乐意使用YAML文件来做配置文件,为了工作需要,学习和了解YAML的语法是非常必要。 YAML是一种数据序列化语言,有些类是于JSON,因为这种语言对格式要求严格,又是以数据本身为中心的语言,所以很适合做配置文件。文件后缀名以 .yaml.yml 为后缀名。这里将对这种语法进行简单的介绍。

  • 这里使用JSON来说明YAML的含义

  • 使用工具是YAML和JSON互转的工具(网站链接

注意:

  1. YAML区分大小写。
  2. YAML在创建YAML文件时不允许使用制表符,只允许使用空格。
  3. YAML同级排首对齐(一般2/4个空格)
  4. YAML键值以冒号+空格分开(例如:key: value)

一、缩进和注释

对于缩进,YAML只有三点要求:

1、只能使用空格

2、同级排首对齐

3、键值以冒号+空格分开

注释使用#进行单行注释,YAML不支持多行注释

例如:

YAML:

#正规格式
a: b
c:
  - c1
  - c2
d: 
  key1: value1
  key2: value2
--- 
#值格式错位,但是格式满足要求依然正确
c:
  - c1
  -             c2
d: 
  key1:       value1
  key2:              value2

JSON:

//正规格式
{
  "a": "b",
  "c": [
    "c1",
    "c2"
  ],
  "d": {
    "key1": "value1",
    "key2": "value2"
  }
}

//值格式错位,但是格式满足要求依然正确
{
  "c": [
    "c1",
    "c2"
  ],
  "d": {
    "key1": "value1",
    "key2": "value2"
  }
}

二、键值对、对象、map、list

YMAL:

a: value1           #键值对
b:                  #对象
  name: Name
  age: 12
map:                #map
  key1: value1
  key2: value2
list:               #简单数组
  - 12
  - 13
  - 14
objectlist:         #对象数组
  -
    name: name1
    age: 12
  -
    name: name2
    age: 13
    
?                  #复杂对象,表示key是一个数组,值也是数组,当然对象也可以
    - key1
    - key2
:
    - value1
    - value2

JSON:

{
  "a": "value1",
  "b": {
    "name": "Name",
    "age": 12
  },
  "map": {
    "key1": "value1",
    "key2": "value2"
  },
  "list": [
    12,
    13,
    14
  ],
  "objectlist": [
    {
      "name": "name1",
      "age": 12
    },
    {
      "name": "name2",
      "age": 13
    }
  ],
  "[\"key1\", \"key2\"]": [
    "value1",
    "value2"
  ]
}

YAML中还支持流式(flow)语法表示对象,比如上面例子可以写为:

a: value1                                  #键值对
b: {name: Name,age: 12}                    #对象 
map: {key1: value1,key2: value2}           #map 
list: [12,13,14]                           #简单数组
objectlist: [{name: name1,age: 12},{name: name2,age: 13}] #对象数组   
[key1,key2] : [value1,value2]              #复杂对象,表示key是一个数组,值也是数组,当然对象也可以

JSON:

{
  "a": "value1",
  "b": {
    "name": "Name",
    "age": 12
  },
  "map": {
    "key1": "value1",
    "key2": "value2"
  },
  "list": [
    12,
    13,
    14
  ],
  "objectlist": [
    {
      "name": "name1",
      "age": 12
    },
    {
      "name": "name2",
      "age": 13
    }
  ],
  "[\"key1\", \"key2\"]": [
    "value1",
    "value2"
  ]
}

三、基本常量的表示方法

在YAML语法中如何表示基本常量呢,下面举例说明

# 整数
int:
    - 123
    - 0b1010_0111_0100_1010_1110    #二进制表示
canonical: 12345
decimal: +12,345
sexagecimal: 3:25:45
octal: 014
hexadecimal: 0xC

#浮点数
float:
    - 3.14
    - 6.8523015e+5  #可以使用科学计数法
canonical: 1.23015e+3
exponential: 12.3015e+02
sexagecimal: 20:30.15
fixed: 1,230.15

boolean: 
    - TRUE  #true,True都可以
    - FALSE  #false,False都可以


nullObj:
    nodeName: 'node'
    parent: ~  #使用~表示null
string:
    - Hello world
    - 'Hello world'  #可以使用双引号或者单引号包裹特殊字符
    - newline
      newline2    #字符串可以拆成多行,每一行会被转化成一个空格
date:
    - 2019-11-16    #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime: 
    -  2019-11-16T05:42:31+08:00    #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

JSON

{
  "int": [
    123,
    685230
  ],
  "canonical": 1230.15,
  "decimal": 12345,
  "sexagecimal": 73809.0,
  "octal": 12,
  "hexadecimal": 12,
  "float": [
    3.14,
    685230.15
  ],
  "exponential": 1230.15,
  "fixed": 1230.15,
  "boolean": [
    true,
    false
  ],
  "nullObj": {
    "nodeName": "node",
    "parent": null
  },
  "string": [
    "Hello world",
    "Hello world",
    "newline newline2"
  ],
  "date": [
    "2019-11-16"
  ],
  "datetime": [
    "2019-11-15 16:42:31 -0500"
  ]
}

四、特殊符号

1、— 和 …

在YAML里 — 和 …表示文档的开始和结束,相当于一个文件可以当作多个文件使用

server:
  port: 8080
spring:
  profiles:
    active: dev
---
server:
  port: 8081
spring:
  profiles: dev
...
---
server:
  port: 8082
spring:
  profiles: prod
...

一般情况下…可以省略

server:
  port: 8080
spring:
  profiles:
    active: dev
---
server:
  port: 8081
spring:
  profiles: dev
---
server:
  port: 8082
spring:
  profiles: prod

记住要用…必须是 — 开头, … 结尾,不能反了使用。

2、"" 和 ''的使用

这个在字符串中使用是有区别的;

双引号会对字符传中的特殊字符进行转译,但是单引号不会

YMAL

DoubleQuotes: "双引号\n"
Apostrophe: '单引号\n'

JSON

{
  "DoubleQuotes": "双引号\n",
  "Apostrophe": "单引号\\n"
}

3、!!

在YAML中 !! 表示强制转换

YAML

number1: 1234
number2: !!str 1234

JSON

{
  "number1": 1234,
  "number2": "1234"
}

4、> 和 |

符号 > 表示字符串折叠,下面同级的字符串其实表示一行,保留一个字符串

符号 | 表示字符串换行,每行字符串都保留了一个换行符

YAML

string1: >
  第一行
  第二行
string2: |
  第一行
  第二行
#这一行是为了添加一个换行符

JSON

{
  "string1": "第一行 第二行\n",
  "string2": "第一行\n第二行\n"
}

5、&、* 和 << 符号的使用

& 表示锚点

* 表示引入

<< 表示合并

YAML

AnchorPoint: &AP {X: 1,Y: 2,Z: 3} #设置锚点,类似于 AP=AnchorPoint
example:
  a: 1
  Introduce: *AP         #引入锚点,类似于 Introduce=AP
  <<: *AP                #合并锚点,类似于 example.push(AP)

JSON

{
  "AnchorPoint": {
    "X": 1,
    "Y": 2,
    "Z": 3
  },
  "example": {
    "a": 1,
    "Introduce": {
      "X": 1,
      "Y": 2,
      "Z": 3
    },
    "X": 1,
    "Y": 2,
    "Z": 3
  }
}

以上就介绍完了YAML的基本语法了,这些基本足够开发过程中使用了,只有配置中的其他操作,可能需要依托平台提供的工具才能使用,这里就不介绍了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章