java中snakeyaml工具包操作yaml文件,什么是yaml文件,yaml如何解析转换为实体,实体如何生成yaml文件

时间:2025-04-04 21:13:10

什么是yaml文件

这里就不去搞yaml的书面意思了,其实就可以理解为一种数据文件,里面的数据是以键值对的方式存储的。java中map就是键值对的形式,我们带着这个概念去理解。举个例子:

school:
  classroom:
    student:
    - 小明
    - 小红
    teacher: 老王
  playground:
  - 足球场
  - 篮球场

school有两个属性:classroom和playground
class有两个属性:student和teacher
对应的java实体就是这样的:

public class YamlPojo {
	private School school;
	public static class School {
		private Classroom classroom;
		private List<String> playground;
	}
	public static class Classroom {
		private List<String> student;
		private String teacher;
	}
}

这样呢,就把yaml文件和java实体对应了起来,有了对应关系,接下来就是通过snakeyaml来进行操作了。
当然,少不了依赖哦,我用的1.26版本,相对稳定,其他版本的也满足使用需求

<dependency>
	<groupId></groupId>
	<artifactId>snakeyaml</artifactId>
	<version>1.26</version>
</dependency>

snakeyaml解析yaml文件

如何将yaml文件转成java实体呢,超级简单啦,上代码!

File file = new File("yaml文件路径");
Yaml yaml = new Yaml();
YamlPojo yamlPojo = yaml.loadAs(new FileReader(file), YamlPojo.class);

这样就ok啦!

snakeyaml通过java实体生成yaml文件

snakeyaml生成的yaml文件会有标准的缩进,我们不用关心格式问题,只关心实体类即可

File file = new File("yaml文件路径"); //这里会覆盖原文件哦,所以如果有编辑yaml文件的需求,就是先解析,修改值,然后写入。
Yaml yaml = new Yaml();
FileWriter fileWriter = new FileWriter(file);
fileWriter.write(yaml.dumpAsMap(yamlPojo)); //yamlPojo是我们的实体类对象,自行生成即可
fileWriter.close();

一些小问题

如果实体里有属性的值是空,生成的yaml文件里面就会是null,如下:怎么转储空字段呢?

school:
  classroom:
    student:
    - 小明
    - 小红
    teacher: null
  playground:null

我们可以自定义null值的输出形式:

public void test() {
	DumperOptions options = new DumperOptions();
	options.setDefaultFlowStyle(FlowStyle.BLOCK);
	Yaml yaml = new Yaml(new NullRepresenter(), options);
	FileWriter fileWriter = new FileWriter(file);
	fileWriter.write(yaml.dumpAsMap(yamlPojo)); //yamlPojo是我们对应的实体类对象,自行生成即可
	fileWriter.close();
}

public class NullRepresenter extends Representer {
    public NullRepresenter() {
        super();
        this.nullRepresenter = new RepresentNull();
    }

    private class RepresentNull implements Represent {
        public Node representData(Object data) {
            return representScalar(Tag.NULL, "");
        }
    }
}

这样输出的yaml就是这样的了:

school:
  classroom:
    student:
    - 小明
    - 小红
    teacher:
  playground: