添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

YAML 简介

YAML,即 YAML Ain’t a Markup Language(YAML 不是一种标记语言)的递归缩写。YAML 其实意思是 Yet Another Markup Language(仍是一种标记语言)。它主要强度这种语言是以数据为中心,而不是以标记为中心,而像 XML 语言就使用了大量的标记。

YAML 可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,还可以简单表达数组、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件。

YAML 配置文件后缀为 .yml ,例如 application.yml

  • YAML 使用 Unicode 字符,也可使用 UTF-8 或 UTF-16。
  • 数据结构采用键值对的形式,即 键名称: 值 ,注意冒号后面要有空格。
  • 数组中的每个元素单独一行,并以 - 开头,例如 - 陈皮 。或使用方括号,元素用逗号隔开,例如 ["陈皮", "狗蛋"] 。注意短横杆和逗号后面都有空格。
  • 散列表中的每个成员单独一行,使用键值对形式,例如 name: 陈皮 。或者使用大括号并用逗号分开,例如 {"name": 陈皮, "age": 18}
  • 字符串值一般不使用引号,必要时可使用,使用双引号表示字符串时,会转义字符串中的特殊字符(例如 \n )。使用单引号时不会转义字符串中的特殊字符。
  • 字母大小写敏感。
  • 使用缩进表示层级关系,缩进使用空格不推荐使用 tab,因为在不同系统 tab 长度可能不一样。
  • 缩进的空格数可以任意,只要相同层级的元素左对齐即可。
  • 用连续三个连字号 --- 划分多个文档块。还有选择性的连续三个点号 ... 表示文件结尾。
  • # 表示注释,可以出现在一行中的任何位置,单行注释。
  • 使用逗号和冒号时,后面都必须接一个空白字符。所以可以在字符串或数值中自由加入分隔符号(例如 5,280 或者 http://www.wikipedia.org )而不需要使用引号。
  • 标量:单个的、不可再分的值。
  • 对象:键值对的集合。
  • 数组:一组按次序排列的值,又称为序列或者列表。

标量是最基础的数据类型,不可再分的值,他们一般用于表示单个的变量,有以下七种:

  1. 字符串
  2. 布尔值
  3. 整数
  4. 浮点数
  5. Null
  6. 时间
  7. 日期
# 字符串
string.value: 陈皮
# 布尔值,true或false
boolean.value: true
boolean.value1: false
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # 二进制
# 浮点数
float.value: 3.14159
float.value1: 314159e-5 # 科学计数法
# Null,~代表null
null.value: ~
# 时间,时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
datetime.value: !!timestamp 2021-04-13T10:31:00+08:00
# 日期,日期必须使用ISO 8601格式,即yyyy-MM-dd
date.value: !!timestamp 2021-04-13

在程序中引入以上配置变量,如下所示。

package com.chenpi.config;
import java.util.Date;
import lombok.Getter;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 * @author 陈皮
 * @version 1.0
 * @description
 * @date 2022/4/10
@Component
@Getter
@ToString
public class PropConfig {
  @Value("${string.value}")
  private String stringValue;
  @Value("${boolean.value}")
  private boolean booleanValue;
  @Value("${boolean.value1}")
  private boolean booleanValue1;
  @Value("${int.value}")
  private int intValue;
  @Value("${int.value1}")
  private int intValue1;
  @Value("${float.value}")
  private float floatValue;
  @Value("${float.value1}")
  private float floatValue1;
  @Value("${null.value}")
  private String nullValue;
  @Value("${datetime.value}")
  private Date datetimeValue;
  @Value("${date.value}")
  private Date dateValue;

对以上对象输出打印,结果如下:

PropConfig(stringValue=陈皮, booleanValue=true, booleanValue1=false, intValue=10, intValue1=685230, floatValue=3.14159, floatValue1=3.14159, nullValue=, datetimeValue=Wed Apr 14 00:31:00 CST 2021, dateValue=Tue Apr 13 22:00:00 CST 2021)

单个变量使用键值对 key: value,使用缩进层级的键值对表示一个对象的属性,如下所示:

person:
  name: 陈皮
  age: 18
  man: true

也可以使用大括号的形式key: {key1: value1, key2: value2, ...},如下所示:

person: {name: 陈皮, age: 18, man: true}

然后在程序对这几个属性注入到 Person 对象中,注意 Person 类注入的属性要添加 get 和 set 方法,不然属性无法获取到配置文件的值。使用@ConfigurationProperties代替@value,可以很好的解析复杂对象。

package com.chenpi;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
 * @author 陈皮
 * @version 1.0
 * @description
 * @date 2022/4/10
@Configuration
@ConfigurationProperties(prefix = "person")
@Getter
@Setter
@ToString
public class Person {
  private String name;
  private int age;
  private boolean man;
// Person(name=陈皮, age=18, man=true)

使用短横杆加空格开头的行,组成数组的每一个元素,如下的 address 字段:

person:
  name: 陈皮
  age: 18
  man: true
  address:

也可以使用中括号进行行内显示形式,如下:

person:
  name: 陈皮
  age: 18
  man: true
  address: [深圳, 北京, 广州]

在程序中引入以上配置变量,如下所示。

package com.chenpi;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
 * @author 陈皮
 * @version 1.0
 * @description
 * @date 2022/4/10
@Configuration
@ConfigurationProperties(prefix = "person")
@Getter
@Setter
@ToString
public class Person {
  private String name;
  private int age;
  private boolean man;
  private List<String> address;
// Person(name=陈皮, age=18, man=true, address=[深圳, 北京, 广州])

如果数组字段的成员也是一个数组,继续使用嵌套的形式,如下所示:

person:
  name: 陈皮
  age: 18
  man: true
  address: [深圳, 北京, 广州]
  twoArr:
      - 10
      - 12
      - 30
package com.chenpi;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
 * @author 陈皮
 * @version 1.0
 * @description
 * @date 2022/4/10
@Configuration
@ConfigurationProperties(prefix = "person")
@Getter
@Setter
@ToString
public class Person {
  private String name;
  private int age;
  private boolean man;
  private List<String> address;
  private List<List<Integer>> twoArr;
// Person(name=陈皮, age=18, man=true, address=[深圳, 北京, 广州], twoArr=[[2, 3, 1], [10, 12, 30]])

如果数组成员是一个对象,则可以用如下两种形式:

childs:
    name: 小红
    age: 10
    name: 小王
    age: 15
childs: [{name: 小红, age: 10}, {name: 小王, age: 15}]

如果你想引入多行的文本块,可以使用|符号,注意在冒号:|符号之间要有空格。

person:
  name: |
    Hello Java!!
    I am fine!
    Thanks! GoodBye!

它和加双引号的效果一样,双引号能转义特殊字符:

person:
  name: "Hello Java!!\nI am fine!\nThanks! GoodBye!"

显示指定类型

有时我们需要显示指定某些值的类型,可以使用!(感叹号)显式指定类型。!单叹号通常是自定义类型,!!双叹号是内置类型,例如:

# !!str指定为字符串
string.value: !!str HelloWorld!
# !!timestamp指定为日期时间类型
datetime.value: !!timestamp 2021-04-13T02:31:00+08:00

内置的类型如下:

  • !!int:整数类型
  • !!float:浮点类型
  • !!bool:布尔类型
  • !!str:字符串类型
  • !!binary:二进制类型
  • !!timestamp:日期时间类型
  • !!null:空值
  • !!set:集合类型
  • !!omap,!!pairs:键值列表或对象列表
  • !!seq:序列
  • !!map:散列表类型

引用会用到&锚点和*星号,&用来建立锚点,<<表示合并到当前数据,*用来引用锚点。

xiaohong: &xiaohong
  name: 小红
  age: 20
dept:
  id: D15D8E4F6D68A4E88E
  <<: *xiaohong

上面最终相当于如下:

xiaohong:
  name: 小红
  age: 20
dept:
  id: D15D8E4F6D68A4E88E
  name: 小红
  age: 20

还有一种文件内引用,引用已经定义好的变量,如下:

base.host: https://chenpi.com
add.person.url: ${base.host}/person/add  # 最终值为 https://chenpi.com/person/add

单文件多配置

可以在同一个文件中,实现多文档分区,即多配置。例如在 Spring 项目 application.yml 文件中,通过---分隔多个不同配置集,根据spring.profiles.active的值来决定启用哪个配置集。

# 公共配置
spring:
  profiles:
    active: pro # 指定使用哪个文档块
# 开发环境配置
spring:
  profiles: dev # profiles属性代表配置的名称
server:
  port: 8080
# 生产环境配置
spring:
  profiles: pro
server:
  port: 8081

本次分享到此结束啦~~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,您的支持就是我创作最大的动力!

最全 Yaml 语法详解简单说明基本语法Yaml 支持的数据结构对象类型:对象的一组键值对,使用冒号结构表示数组类型:一组连词线开头的行,构成一个数组复合结构:对象和数组可以结合使用,形成复合结构纯量:纯量是最基本的、不可再分的值引用参考 Yaml 是一个可读性高,用来表达数据序列的格式。Yaml 的意思是:仍是一种标记语言,强调这种语言以数据做为中心,而不是以标记语言为重点 缩进时不允许使用 Tab 键,只允许使用空格 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 标识注释,从这个字符一直到行尾,都会被解释器忽略 Yaml 支持的数据结构 对象:键值对的集合,又称 #reload(sys) #sys.setdefaultencoding('utf-8') ######################对input输入字符类型判断并转化##################### def input_handle(s): if str.isdigit(s): YAML介绍 YAML是”YAML Ain’t a Markup Language”(YAML不是一种置标语言)的递归缩写,早先YAML的意思其实是:”Yet Another Markup Language”(另外一种置标语言) YAML语法 YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16 使用空白字符(不能使用Tab)分层,同层元素左侧对齐 单行注解由井字号(... portport是k8s集群内部访问service的端口,即通过clusterIP:port可以从pod所在的node上访问到service。nodeportnodeport是外部访问k8s集群中service的端口,通过nodeip:nodeport可以外部访问到某个servicetargetporttargetport是pod的端口,从port或nodeport来的流量经过kube-proxy反向代理负载均衡转发到后端pod的targetport上,最后进入容器。 yaml的语法: 1、在yaml里面,结构通过缩进来表示,连续的项目(如:数组元素、集合元素)通过减号“-”来表示,map结构里面的键值对(key/value)用冒号“:”来分割。 yaml也有用来描述好几行相同结构数据的缩写语法,数组用“[]”包括起来,hash用“{}”... 结束符通常是可选的。但由于它是一个严格的超集,它可以做JSON可以做的一切,甚至更多。一个主要的区别是,换行符和缩进在YAML中实际上是有意义的,而JSON则使用方括号和大括号。所以,正如我们已经看到的,值可以是一个字符串,一个数字,或另一个字典。今天在看Linux kernel里的device tree的documentation时,发现里面的文档格式都是YAML的,用来描述devicetree某类结点的格式,所以就了解了一下。正如你所期望的,Ox表示一个值是十六进制的,而前导零表示一个八进制的值。 1. 认识 YAML   YAML是一个类似 XML、JSON 的标记性语言。YAML 强调以数据为中心,并不是以标识语言为重点。因而 YAML 本身的定义比较简单,号称“一种人性化的数据格式语言”。 1.1 YAML 的设计目标: 人类容易阅读 可用于不同程序间的数据交换 适合描述程序所使用的数据结构,特别是脚本语言 丰富的表达能力与可扩展性... 2,使用空格表示层级关系(缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格) 3,不支持Tab键制表符缩进,只使用空格缩进 4,"---"表示YAML格式,一个文件的开始,用于分隔文件间 5,字符后缩进一个空格,如冒号,逗号,短横杆(-)等 6,字符串默认不用加单引号和双引号,双引号不会转义里面的特殊字符,单引号会转移里面的字符 7,"#”表示注释 二、数据结构的Yaml表示 1、Map数据结构 Java表示 public class.. YAML,即 ”YAML Ain’t a Markup Language“(YAML 不是一种标记语言)的递归缩写,YAML 意思其实是“ Yet Another Markup Language"(仍是一种标记语言)。该配置文件类型主要强调这种语言是主要侧重于匹配值数据,而不是以标记为中心, 以标记为中心的主要是XML语言。YAML 可读性高,容易理解,用来表达数据序列化的格式。.........