1.SnakeYml2.jackson-dataformat-yaml3.Value4.ConfigurationProperties
1.SnakeYmlorg.yaml snakeyaml1.23
person1: name: hydra gender: male person2: name: susan gender: female
在使用SnakeYml解析yml时,最常使用的就是load、loadlAll、loadAs方法,这三个方法可以加载yml文件或字符串,最后返回解析后的对象。我们先从基础的load方法开始演示:
public void test1(){
Yaml yaml=new Yaml();
Map map =
yaml.load(getClass().getClassLoader()
.getResourceAsStream("snake1.yml"));
System.out.println(map);
}
{person1={name=hydra, gender=male}, person2={name=susan, gender=female}}
接下来看一下loadAll方法,它可以用来加载yml中使用—连接符连接的多个文档,将上面的yml文件进行修改:
person1: name: hydra gender: male --- person2: name: susan gender: female
在添加了连接符后,尝试再使用load方法进行解析,报错如下显示发现了另一段yml文档从而无法正常解析:
用loadAll
public void test2(){
Yaml yaml=new Yaml();
Iterable
{person1={name=hydra, gender=male}}
{person2={name=susan, gender=female}}
可以看到,loadAll方法返回的是一个对象的迭代,里面的每个对象对应yml中的一段文档,修改后的yml文件就被解析成了两个独立的Map。
接下来再来看一下loadAs方法,它可以在yml解析过程中指定类型,直接封装成一个对象。我们直接复用上面的snake1.yml,在解析前先创建两个实体类对象用于接收:
@Data
public class Person {
SinglePerson person1;
SinglePerson person2;
}
@Data
public class SinglePerson {
String name;
String gender;
}
下面使用loadAs方法加载yml,注意方法的第二个参数,就是用于封装yml的实体类型。
public void test3(){
Yaml yaml=new Yaml();
Person person =
yaml.loadAs(getClass().getClassLoader().
getResourceAsStream("snake1.yml"), Person.class);
System.out.println(person.toString());
}
Person(person1=SinglePerson(name=hydra, gender=male), person2=SinglePerson(name=susan, gender=female))
实际上,如果想要将yml封装成实体对象,也可以使用另一种方法。在创建Yaml对象的时候,传入一个指定实体类的构造器对象,然后直接调用load方法就可以实现:
public void test4(){
Yaml yaml=new Yaml(new Constructor(Person.class));
Person person = yaml.load(getClass().getClassLoader().
getResourceAsStream("snake1.yml"));
System.out.println(person.toString());
}
执行结果与上面相同:
Person(person1=SinglePerson(name=hydra, gender=male), person2=SinglePerson(name=susan, gender=female))
SnakeYml其实实现了非常多的功能,这里就不一一列举了,有兴趣的小伙伴可以自己查看一下文档。如果你看了上一篇的文章后跟着翻阅了一下源码,那么你会发现,其实在SpringBoot的底层,也是借助了SnakeYml来进行的yml的解析操作。
2.jackson-dataformat-yamlcom.fasterxml.jackson.dataformat jackson-dataformat-yaml2.12.3
使用jackson读取yml也非常简单,这里用到了常用的ObjectMapper,在创建ObjectMapper对象时指定使用YAML工厂,之后就可以简单的将yml映射到实体:
public void read() throws IOException {
ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
InputStream input =
new FileInputStream("F:\Work\yml\src\main\resources\snake1.yml");
Person person = objectMapper.readValue(input, Person.class);
System.out.println(person.toString());
}
Person(person1=SinglePerson(name=hydra, gender=male), person2=SinglePerson(name=susan, gender=female))
如果想要生成yml文件的话,可以调用ObjectMapper的writevalue方法实现:
public void write() throws IOException {
Map map=new HashMap<>();
SinglePerson person1 = new SinglePerson("Trunks", "male");
SinglePerson person2 = new SinglePerson("Goten", "male");
Person person=new Person(person1,person2);
map.put("person",person);
ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
objectMapper
.writevalue(new File("F:\Work\yml\src\main\resources\jackson-gen.yml"),map);
}
3.Value
@Value("${server.port}")
private Integer port;
@RequestMapping("valueGetConfig")
private Integer hello3() {
return port;
}
4.ConfigurationProperties
@ConfigurationProperties(prefix = "com.muxin")
@Component
@Data
public class MyConfig {
private String name;
}



