前言
YAML(YAML Ain't Markup Language),也可以叫做YML,是一種人性化的數據序列化的語言,類似於XML,JSON。SpringBoot的配置文件就支持yaml文件。官網
語法
- 大小寫敏感
- 使用縮進表示層級關系
- 縮進時不允許使用Tab鍵,只允許使用空格。
- 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
- #表示注釋,從這個字符一直到行尾,都會被解析器忽略。
yaml有三種數據結構
對象
寫在一行
address: {province: 山東, city: 濟南}
寫在多行
address:
province: 山東
city: 濟南
數組
寫在一行
hobbyList: [游泳, 跑步]
寫在多行
hobbyList:
- 游泳
- 跑步
純量
- 字符串 默認不用加引號,包含空格或特殊字符必須加引號,單引號或雙引號都可以
userId: S123
username: "lisi"
password: '123456'
province: 山東
city: "濟南 : ss"
- 布爾值
success: true
- 整數
age: 13
- 浮點數
weight: 75.5
- Null
gender: ~
- 時間
時間使用ISO8601標准 ISO8601
createDate: 2001-12-14T21:59:43.10+05
使用snakeyaml將yaml文件解析成javabean
添加maven依賴
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.27</version>
</dependency>
yaml文件,既可以.yaml結尾,也可以.yml結尾,支持兩種方式的擴展名。
userId: 1
username: lisi
password: 123456
address: {province: 山東, city: 濟南}
hobbyList: [游泳, 跑步]
或
userId: 1
username: "lisi"
password: '123456'
address:
province: 山東
city: "濟南 : ss"
hobbyList:
- 游泳
- 跑步
import java.io.InputStream;
import java.sql.Timestamp;
import java.util.List;
import java.util.Objects;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.yaml.snakeyaml.Yaml;
public class Client {
public static void main(String[] args) {
InputStream resource = Client.class.getClassLoader().getResourceAsStream("User.yaml");
if (Objects.nonNull(resource)) {
Yaml yaml = new Yaml();
User user = yaml.loadAs(resource, User.class);
System.out.println(user.getClass());
System.out.println(user);
}
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class User {
private String userId;
private String username;
private String password;
private Timestamp createDate;
private Address address;
private List<String> hobbyList;
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class Address {
private String province;
private String city;
}
}
一鍵轉換,還是很方便的。
使用snakeyaml根據javabean生成yaml文件
import java.util.Arrays;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.yaml.snakeyaml.Yaml;
public class Client {
public static void main(String[] args) {
User user = new User();
user.setUserId("1");
user.setUsername("lisi");
user.setPassword("123456");
user.setAddress(new Address("山東", "濟南"));
user.setHobbyList(Arrays.asList("游泳", "跑步"));
Yaml yaml = new Yaml();
String userString = yaml.dump(user);
System.out.println(userString);
System.out.println(yaml.loadAs(userString, User.class));
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class User {
private String userId;
private String username;
private String password;
private Address address;
private List<String> hobbyList;
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class Address {
private String province;
private String city;
}
}
輸出結果為
!!com.imooc.sourcecode.java.yaml.test2.Client$User
address: {city: 濟南, province: 山東}
hobbyList: [游泳, 跑步]
password: '123456'
userId: '1'
username: lisi
上面的對象和數組是顯示在一行,我們也可以通過自定義序列化顯示為多行
import java.util.Arrays;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.DumperOptions.FlowStyle;
import org.yaml.snakeyaml.Yaml;
public class Client {
public static void main(String[] args) {
User user = new User();
user.setUserId("1");
user.setUsername("lisi");
user.setPassword("123456");
user.setAddress(new Address("山東", "濟南"));
user.setHobbyList(Arrays.asList("游泳", "跑步"));
//序列化參數
DumperOptions dumperOptions = new DumperOptions();
dumperOptions.setDefaultFlowStyle(FlowStyle.BLOCK);
Yaml yaml = new Yaml(dumperOptions);
String userString = yaml.dump(user);
System.out.println(userString);
System.out.println(yaml.loadAs(userString, User.class));
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class User {
private String userId;
private String username;
private String password;
private Address address;
private List<String> hobbyList;
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class Address {
private String province;
private String city;
}
}
輸出結果為
!!com.imooc.sourcecode.java.yaml.test3.Client$User
address:
city: 濟南
province: 山東
hobbyList:
- 游泳
- 跑步
password: '123456'
userId: '1'
username: lisi
關於snakeyaml的更多用法,請查看 snakeyaml文檔
使用jackson將yaml文件解析成javabean
添加依賴
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.12.0</version>
</dependency>
jackson-dataformat-yaml是在snakeyaml的基礎上又封裝了一層。
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Objects;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
public class Client2 {
public static void main(String[] args) throws IOException {
InputStream resource = Client.class.getClassLoader().getResourceAsStream("User.yaml");
if (Objects.nonNull(resource)) {
YAMLMapper yamlMapper = new YAMLMapper();
User user = yamlMapper.readValue(resource, User.class);
System.out.println(user.getClass());
System.out.println(user);
}
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class User {
private String userId;
private String username;
private String password;
private Address address;
private List<String> hobbyList;
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class Address {
private String province;
private String city;
}
}
使用jackson根據javabean生成yaml文件
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
import java.util.Arrays;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
public class Client {
public static void main(String[] args) throws JsonProcessingException {
User user = new User();
user.setUserId("1");
user.setUsername("lisi");
user.setPassword("123456");
user.setAddress(new Address("山東", "濟南"));
user.setHobbyList(Arrays.asList("游泳", "跑步"));
YAMLMapper yamlMapper = new YAMLMapper();
System.out.println(yamlMapper.writeValueAsString(user));
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class User {
private String userId;
private String username;
private String password;
private Address address;
private List<String> hobbyList;
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class Address {
private String province;
private String city;
}
}
輸出結果為
---
userId: "1"
username: "lisi"
password: "123456"
address:
province: "山東"
city: "濟南"
hobbyList:
- "游泳"
- "跑步"
SpringBoot是如何解析yaml文件的
yaml會將字符串解析成對象的格式,spring會將對象扁平化,如
spring:
application:
name: test
spring會轉換成spring.application.name=test,和properties文件的格式統一。