在Java中使用YAML:库概览与使用示例
YAML(YAML Ain't Markup Language)是一种数据序列化格式,由于其可读性高,常用于配置文件。在Java中,处理YAML主要使用两个库:SnakeYAML(轻量、快速)和Jackson YAML(功能强大,支持注解)。本文将详细介绍这两个库,并展示读取、写入和对象序列化的示例。
1. SnakeYAML库
SnakeYAML是Java中最流行的YAML处理库。它支持YAML 1.1的完整语法,包括标签、锚点和自定义类型。主要功能:
- 将YAML读取为
Map、List或自定义Java对象 - 将Java对象写入YAML
- 支持递归结构
- 低内存消耗
引入SnakeYAML(Maven)
<dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>2.2</version></dependency>读取YAML文件
考虑以下YAML文件config.yaml示例:
server: host: localhost port: 8080database: url: jdbc:mysql://localhost:3306/mydb user: admin password: secret读取的Java代码:
import org.yaml.snakeyaml.Yaml;import java.io.InputStream;import java.util.Map;
public class SnakeYamlReader { public static void main(String[] args) { Yaml yaml = new Yaml(); try (InputStream in = SnakeYamlReader.class .getClassLoader() .getResourceAsStream("config.yaml")) { Map<String, Object> data = yaml.load(in); System.out.println("服务器主机: " + ((Map<String, Object>) data.get("server")).get("host")); } catch (Exception e) { e.printStackTrace(); } }}写入YAML
import org.yaml.snakeyaml.Yaml;import java.util.Map;import java.util.LinkedHashMap;
public class SnakeYamlWriter { public static void main(String[] args) { Map<String, Object> data = new LinkedHashMap<>(); Map<String, Object> server = new LinkedHashMap<>(); server.put("host", "127.0.0.1"); server.put("port", 9090); data.put("server", server);
Yaml yaml = new Yaml(); String output = yaml.dump(data); System.out.println(output); }}2. Jackson YAML库
Jackson YAML是Jackson的一个模块,增加了对YAML格式的支持。主要优势:
- 与Jackson注解完全集成(
@JsonProperty、@JsonIgnore) - 直接操作POJO对象,无需额外的Map
- 通过流式处理实现高性能
- 支持YAML 1.1和部分1.2
引入Jackson YAML(Maven)
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> <version>2.16.1</version></dependency>将POJO序列化为YAML
创建一个配置类:
import com.fasterxml.jackson.annotation.JsonProperty;
public class AppConfig { @JsonProperty("server") private ServerConfig server; @JsonProperty("database") private DatabaseConfig database; // getter和setter方法 public ServerConfig getServer() { return server; } public void setServer(ServerConfig server) { this.server = server; } public DatabaseConfig getDatabase() {