在现代软件开发中,YAML(YAML Ain’t Markup Language)格式因其简洁和易于阅读的特性而受到开发者的青睐。在Java世界中,SnakeYAML是一个流行的库,用于解析和生成YAML数据。本文将通过几个实例,详细探讨如何使用SnakeYAML在Java中加载和解析YAML数据。
1. 从字符串加载YAML数据
首先,我们来看如何从一个YAML格式的字符串加载数据。以下是一个简单的Java类,演示了如何实现这一过程:
import org.yaml.snakeyaml.Yaml;
public class LoadingString {
public static void main(String[] args) {
Yaml yaml = new Yaml();
Object obj = yaml.load(getStringYmlData());
System.out.println("Loaded object type: " + obj.getClass());
System.out.println(obj);
}
public static String getStringYmlData() {
return "name: Joe\n"
+ "phone: 111-111-1111\n"
+ "address: Park Dr, Charlie Hill";
}
}
输出结果
Loaded object type: class java.util.LinkedHashMap
{name=Joe, phone=111-111-1111, address=Park Dr, Charlie Hill}
2. 从文件加载YAML数据
接下来,我们探索如何从文件中加载YAML数据。以下代码展示了如何实现:
import org.yaml.snakeyaml.Yaml;
import java.io.InputStream;
import java.io.IOException;
public class LoadFile {
public static void main(String[] args) throws IOException {
Yaml yaml = new Yaml();
try (InputStream in = LoadFile.class.getResourceAsStream("/person.yml")) {
Object obj = yaml.load(in);
System.out.println("Loaded object type:" + obj.getClass());
System.out.println(obj);
}
}
}
文件内容 (src/main/resources/person.yml)
name: Joe
phone: 111-11-11111
address: Park Dr, Charlie Hill
输出结果
Loaded object type:class java.util.LinkedHashMap
{name=Joe, phone=111-11-11111, address=Park Dr, Charlie Hill}
3. 从文件加载多个YAML文档
SnakeYAML还支持从单个文件中加载多个YAML文档。以下是一个示例:
文件内容 (src/main/resources/persons.yml)
name: Joe
phone: 111-111-1111
address: Park Dr, Charlie Hill
---
name: Trish
phone: 111-111-11111
address: Small Vine, River Town
import org.yaml.snakeyaml.Yaml;
import java.io.InputStream;
import java.io.IOException;
import java.util.Iterator;
public class LoadAll {
public static void main(String[] args) throws IOException {
loadFromFile("/person.yml");
loadFromFile("/persons.yml");
}
private static void loadFromFile(String path) throws IOException {
System.out.printf("-- loading from %s --%n", path);
Yaml yaml = new Yaml();
try (InputStream in = LoadAll.class.getResourceAsStream(path)) {
Iterable<Object> itr = yaml.loadAll(in);
System.out.println("-- iterating loaded Iterable --");
for (Object o : itr) {
System.out.println("element type: " + o.getClass());
System.out.println(o);
}
}
}
}
输出结果
-- loading from /person.yml --
-- iterating loaded Iterable --
element type: class java.util.LinkedHashMap
{name=Joe, phone=111-111-1111, address=Park Dr, Charlie Hill}
-- loading from /persons.yml --
-- iterating loaded Iterable --
element type: class java.util.LinkedHashMap
{name=Joe, phone=111-111-1111, address=Park Dr, Charlie Hill}
element type: class java.util.LinkedHashMap
{name=Trish, phone=111-111-11111, address=Small Vine, River Town}
项目依赖和技术栈
- SnakeYAML 1.18: YAML 1.1 解析器和生成器,用于Java。
- JDK 1.8
- Maven 3.3.9
通过上述示例,我们可以看到SnakeYAML在Java中加载和解析YAML数据的强大功能。无论是从字符串还是文件,SnakeYAML都提供了简单而强大的API来处理YAML数据。希望这篇文章能帮助你在项目中更有效地使用YAML。