pringboot:Java操作Yaml文件
一、介绍
YAML,也可以叫做YML,是一种人性化的数据序列化语言,类似于XML,JSON
二、语法
大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
#表示注释,从这个字符一直到行尾,都会被解析器忽略。
对象
写在一行
address: {province: 山东, city: 济南}
1
写在多行
address:
province: 山东
city: 济南
数组
写在一行
hobbyList: [游泳, 跑步]
1
写在多行
hobbyList:
– 游泳
– 跑步
纯量
字符串 默认不用加引号,包含空格或特殊字符必须加引号,单引号或双引号都可以
userId: S123
username: "lisi"
password: '123456'
province: 山东
city: "济南 : ss"
布尔值
success: true
整数
age: 18
浮点数
weight: 66.6
NUll
gender: ~
时间 :时间使用ISO8601标准 [ISO8601](https://baike.baidu.com/item/ISO 8601/3910715?fr=aladdin)
createDate: 2001-12-14T21:59:43.10+05
三、使用snakeyaml将yaml文件解析成Javabean
添加依赖
<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: [游泳, 跑步]
代码示例
@Test
public void yaml2javaBean(){
String path = System.getProperty("user.dir") + "/src/main/resources/prometheus/rules/user.yaml";
if (StringUtils.isNotEmpty(path)) {
Yaml yaml = new Yaml();
try {
User user = yaml.loadAs(new FileReader(path), User.class);
System.out.println(user);
} catch (FileNotFoundException e) {
logger.error("yaml文件转换javabean出错:" + e);
}
}
}
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class User{
private Integer userId;
private String username;
private String password;
private Address address;
private List<String> hobbyList;
}
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class Address{
private String province;
private String city;
}
四、使用snakeyaml根据javabean生成yaml文件
@Test
public void javaBean2yaml(){
User user = User.builder().userId(2).username("张三").password("123456")
.address(new Address("湖北", "武汉"))
.hobbyList(Arrays.asList("篮球", "足球")).build();
String fileName = "user2.yaml";
String path = System.getProperty("user.dir") + "/src/main/resources/prometheus/rules/" + fileName;
Yaml yaml = new Yaml();
try {
yaml.dump(user,new FileWriter(path));
User u = yaml.loadAs(new FileReader(path), User.class);
System.out.println(u);
} catch (IOException e) {
logger.error("javabean转换yaml失败:" + e);
}
}
输出结果为
!!org.mye.myTest.YamlTest$User
address: {city: 武汉, province: 湖北}
hobbyList: [篮球, 足球]
password: '123456'
userId: 2
username: 张三
上面的对象和数组是显示在一行,我们也可以通过自定义序列化显示为多行
@Test
public void javaBean2yaml2(){
User user = User.builder().userId(2).username("张三").password("123456")
.address(new Address("湖北", "武汉"))
.hobbyList(Arrays.asList("篮球", "足球")).build();
String fileName = "user3.yaml";
String path = System.getProperty("user.dir") + "/src/main/resources/prometheus/rules/" + fileName;
//序列化参数
DumperOptions dumperOptions = new DumperOptions();
dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
Yaml yaml = new Yaml(dumperOptions);
try {
yaml.dump(user,new FileWriter(path));
User u = yaml.loadAs(new FileReader(path), User.class);
System.out.println(u);
} catch (IOException e) {
logger.error("javabean转换yaml失败:" + e);
}
}
输出结果
!!org.mye.myTest.YamlTest$User
address:
city: 武汉
province: 湖北
hobbyList:
– 篮球
– 足球
password: '123456'
userId: 2
username: 张三
关于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的基础上又封装了一层。
@Test
public void readYaml(){
String fileName = "user.yaml";
String path = System.getProperty("user.dir") + "/src/main/resources/prometheus/rules/" + fileName;
if (StringUtils.isNotBlank(path)){
YAMLMapper yamlMapper = new YAMLMapper();
try {
User user = yamlMapper.readValue(new FileReader(path), User.class);
System.out.println(user);
} catch (IOException e) {
logger.error("读取" + fileName + "文件失败:" + e);
}
}
}
六、使用jackson根据javabean生成yaml文件
@Test
public void writeYaml() {
User user = User.builder().userId(2).username("张三").password("123456")
.address(new Address("湖北", "武汉"))
.hobbyList(Arrays.asList("篮球", "足球")).build();
String fileName = "user.yaml";
String path = System.getProperty("user.dir") + "/src/main/resources/prometheus/rules/" + fileName;
YAMLMapper yamlMapper = new YAMLMapper();
try {
String s = yamlMapper.writeValueAsString(user);
User u = yamlMapper.readValue(new FileReader(path), User.class);
System.out.println(s);
System.out.println(u);
} catch (IOException e) {
logger.error("javabean转换yaml失败:" + e);
}
}
输出结果
—
userId: 2
username: "张三"
password: "123456"
address:
province: "湖北"
city: "武汉"
hobbyList:
– "篮球"
– "足球"
YamlTest.User(userId=1, username=lisi, password=123456, address=YamlTest.Address(province=山东, city=济南), hobbyList=[游泳, 跑步])
————————————————
版权声明:本文为CSDN博主「yololee_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43296313/article/details/119598829