Работа с YAML в Java: обзор библиотек и примеры использования
YAML (YAML Ain't Markup Language) — это формат сериализации данных, который часто используется для конфигурационных файлов благодаря своей читаемости. В Java для работы с YAML применяются две основные библиотеки: SnakeYAML (лёгкая, быстрая) и Jackson YAML (мощная, с поддержкой аннотаций). В этой статье мы подробно разберём обе библиотеки, покажем примеры чтения, записи и сериализации объектов.
1. Библиотека SnakeYAML
SnakeYAML — это самая популярная библиотека для работы с YAML в Java. Она поддерживает полный синтаксис 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: 8080
database:
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("Server host: " +
((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;
// геттеры и сеттеры
public ServerConfig getServer() { return server; }
public void setServer(ServerConfig server) { this.server = server; }
public DatabaseConfig getDatabase() { return database; }
public void setDatabase(DatabaseConfig database) { this.database = database; }
}
class ServerConfig {
private String host;
private int port;
// геттеры и сеттеры
}
class DatabaseConfig {
private String url;
private String user;
private String password;
// геттеры и сеттеры
}
Чтение YAML в объект:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.File;
public class JacksonYamlReader {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
AppConfig config = mapper.readValue(
new File("config.yaml"), AppConfig.class);
System.out.println("Server