YAML語法簡易入門

胖先森發表於2018-12-19

YAML 語法

個人感覺這篇文件屬於"搬運工"性質

可以檢視官方或者其他的部落格資料,會有一大堆的內容

YAML語言的設計參考了JSON,XML和SDL等語言。YAML 強調以資料為中心,簡潔易讀,編寫簡單。

有意思的命名:

AML全稱是”YAML Ain’t a Markup Language”(YAML不是一種置標語言)的遞迴縮寫。 在開發的這種語言時,YAML 的意思其實是:”Yet Another Markup Language”(仍是一種置標語言)。

語法特點

  • 大小寫敏感
  • 通過縮排表示層級關係
  • 禁止使用tab縮排,只能使用空格鍵 (個人感覺這條最重要)
  • 縮排的空格數目不重要,只要相同層級左對齊即可
  • 使用#表示註釋

支援的資料結構

  • 物件:鍵值對的集合,又稱為對映(mapping)/ 雜湊(hashes) / 字典(dictionary)
  • 陣列:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
  • 純量(scalars):單個的、不可再分的值

雙引號和單引號的區分

雙引號"":不會轉義字串裡面的特殊字元,特殊字元作為本身想表示的意思。

name: "123\n123"
---------------------------
輸出: 123 換行 123
複製程式碼

如果不加引號將會轉義特殊字元,當成字串處理

值的寫法

1.字串

使用”或”“或不使用引號

value0: 'hello World!'
value1: "hello World!"
value2: hello World!
複製程式碼

2.布林值

truefalse表示。

3.數字

12 #整數 
014 # 八進位制整數 
0xC #十六進位制整數 
13.4 #浮點數 
1.2e+34 #指數 
.inf空值 #無窮大
複製程式碼

4.空值

null~表示

5.日期

使用 iso-8601 標準表示日期

date: 2018-01-01t16:59:43.10-05:00
複製程式碼

在springboot中yaml檔案的時間格式 date: yyyy/MM/dd HH:mm:ss

6.強制型別轉換(瞭解)

YAML 允許使用個感嘆號!,強制轉換資料型別,單歎號通常是自定義型別,雙歎號是內建型別。

money: !!str
123
date: !Boolean
true
複製程式碼

內建型別列表

!!int # 整數型別 
!!float # 浮點型別 
!!bool # 布林型別 
!!str # 字串型別 
!!binary # 也是字串型別 
!!timestamp # 日期時間型別 
!!null # 空值 
!!set # 集合 
!!omap,!!pairs # 鍵值列表或物件列表
!!seq # 序列,也是列表 !!map # 鍵值表
複製程式碼

7.物件(重點)

Map(屬性和值)(鍵值對)的形式: key:(空格)v :表示一堆鍵值對,空格不可省略。

car:
    color: red
    brand: BMW
複製程式碼

一行寫法

car:{color: red,brand: BMW}
複製程式碼

相當於JSON格式:

{"color":"red","brand":"BMW"}
複製程式碼

8.陣列

一組連詞線開頭的行,構成一個陣列。

brand:
   - audi
   - bmw
   - ferrari
複製程式碼

一行寫法

brand: [audi,bmw,ferrari]
複製程式碼

相當於JSON

["auri","bmw","ferrari"]
複製程式碼

9.文字塊

|:使用|標註的文字內容縮排表示的塊,可以保留塊中已有的回車換行

value: |
   hello
   world!
輸出結果:hello 換行 world!
複製程式碼

+表示保留文字塊末尾的換行,-表示刪除字串末尾的換行。

value: |
hello

value: |-
hello

value: |+
hello
輸出:hello\n hello hello\n\n(有多少個回車就有多少個\n)
複製程式碼

注意 “|” 與 文字之間須另起一行

>:使用 > 標註的文字內容縮排表示的塊,將塊中回車替換為空格,最終連線成一行

value: > hello
world!
輸出:hello 空格 world!
複製程式碼

注意 “>” 與 文字之間的空格

10.錨點與引用

使用 & 定義資料錨點(即要複製的資料),使用 * 引用錨點資料(即資料的複製目的地)

name: &a yaml
book: *a
books: 
   - java
   - *a
   - python
輸出book: yaml 
輸出books:[java,yaml,python]
複製程式碼

注意*引用部分不能追加內容


配置檔案注入資料

/**
 * 將配置檔案中配置的每一個屬性的值,對映到這個元件中
 * @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置檔案中相關的配置進行繫結;
 *      prefix = "person":配置檔案中哪個下面的所有屬性進行一一對映
 *
 * 只有這個元件是容器中的元件,才能容器提供的@ConfigurationProperties功能;
 *
 */
@Component //例項化
@ConfigurationProperties(prefix = "person")//yaml或者properties的字首
public class Person {

    private String name;
    private Integer age;
    private Boolean flag;
    private Date birthday;
    private Map<String,Object> maps;
    private List<Object> tempList;
    private Dog dog;
    //省略getter和setter以及toString方法
複製程式碼

我們可以匯入配置檔案處理器,以後編寫配置就有提示了,@ConfigurationPropertiesIDE會提示開啟線上的幫助文件,配置依賴如下:

<!--匯入配置檔案處理器,配置檔案進行繫結就會有提示-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
複製程式碼

application.yaml檔案

person:
  name: 胖先森
  age: 18
  flag: false
  birthday: 2018/12/19 20:21:22 #Spring Boot中時間格式
  maps: {bookName: "西遊記",author: '吳承恩'}
  tempList:
    - 紅樓夢
    - 三國演義
    - 水滸傳
  dog:
    dogName: 大黃
    dogAge: 4
複製程式碼

在test中進行測試如下


@RunWith(SpringRunner.class)
@SpringBootTest
public class Demo03BootApplicationTests {

    @Autowired
    private Person p1;

    @Test
    public void contextLoads() {
        System.out.println(p1);
    }

}
複製程式碼

輸出結果為:Person{name='胖先森', age=18, flag=false, birthday=Wed Dec 19 20:21:22 CST 2018, maps={bookName=西遊記, author=吳承恩}, tempList=[紅樓夢, 三國演義, 水滸傳], dog=Dog{dogName='大黃', dogAge=4}}

application.properties檔案

person123.name=劉備
person123.age=20
person123.birthday=2018/12/19 20:21:22
person123.maps.bookName=水滸傳
person123.maps.author=羅貫中
person123.temp-list=一步教育,步步為贏
person123.dog.dogName=小白
person123.dog.dogAge=5
複製程式碼

java程式碼修改字首

@Component //例項化
@ConfigurationProperties(prefix = "person123")//yaml或者properties的字首
public class Person {

    private String name;
    private Integer age;
    private Boolean flag;
    private Date birthday;
    private Map<String,Object> maps;
    private List<Object> tempList;
    private Dog dog;
    //省略getter和setter以及toString方法
複製程式碼

在test中進行測試如下

@RunWith(SpringRunner.class)
@SpringBootTest
public class Demo03BootApplicationTests {

    @Autowired
    private Person p1;

    @Test
    public void contextLoads() {
        System.out.println(p1);
    }

}
複製程式碼

輸出結果為:Person{name='����', age=20, flag=null, birthday=Wed Dec 19 20:21:22 CST 2018, maps={bookName=ˮ䰴�, author=�޹���}, tempList=[һ������, ����ΪӮ], dog=Dog{dogName='��', dogAge=5}}

屬性檔案中文亂碼問題

YAML語法簡易入門

相關文章