Работа с YAML в Java: библиотеки SnakeYAML и Jackson
YAML (YAML Ain't Markup Language) — это человеко-читаемый формат сериализации данных, часто используемый для конфигурационных файлов, описания API и обмена данными. В экосистеме Java существует несколько библиотек для работы с YAML, но наиболее популярными являются SnakeYAML (низкоуровневый парсер) и Jackson YAML (высокоуровневое решение с поддержкой аннотаций). В этой статье мы подробно рассмотрим обе библиотеки, их возможности и примеры использования.
1. SnakeYAML — классический парсер YAML
SnakeYAML — это простая и легковесная библиотека, которая предоставляет полный контроль над процессом парсинга. Она поддерживает все спецификации YAML 1.1 и позволяет работать как с простыми структурами (Map, List), так и с пользовательскими объектами.
Установка SnakeYAML
Если вы используете Maven, добавьте зависимость в pom.xml:
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.2</version>
</dependency>
Для Gradle:
implementation 'org.yaml:snakeyaml:2.2'
Пример: парсинг YAML-строки в Map
import org.yaml.snakeyaml.Yaml;
import java.util.Map;
public class SnakeYamlExample {
public static void main(String[] args) {
String yamlString = """
server:
host: localhost
port: 8080
database:
url: jdbc:mysql://localhost:3306/mydb
user: admin
password: secret
""";
Yaml yaml = new Yaml();
Map<String, Object> data = yaml.load(yamlString);
System.out.println(data);
// Вывод: {server={host=localhost, port=8080}, database={url=jdbc:mysql://localhost:3306/mydb, user=admin, password=secret}}
}
}
Пример: загрузка YAML из файла
import org.yaml.snakeyaml.Yaml;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Map;
public class SnakeYamlFileExample {
public static void main(String[] args) {
try (InputStream input = new FileInputStream("config.yaml")) {
Yaml yaml = new Yaml();
Map<String, Object> data = yaml.load(input);
System.out.println("Port: " + ((Map<String, Object>) data.get("server")).get("port"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
Пример: сериализация Java-объекта в YAML
import org.yaml.snakeyaml.Yaml;
import java.util.Map;
public class SnakeYamlDumpExample {
public static void main(String[] args) {
Map<String, Object> data = Map.of(
"name", "PythonLib",
"version", 2.0,
"features", List.of("YAML", "JSON", "XML")
);
Yaml yaml = new Yaml();
String output = yaml.dump(data);
System.out.println(output);
// Вывод:
// features:
// - YAML
// - JSON
// - XML
// name: PythonLib
// version: 2.0
}
}
Плюсы SnakeYAML:
- Простой API без лишних зависимостей
- Поддержка пользовательских типов через конструкторы
- Гибкая настройка парсинга (например, игнорирование неизвестных полей)
2. Jackson YAML — современное решение с аннотациями
Jackson YAML — это модуль для популярной библиотеки Jackson, который позволяет работать с YAML так же, как с JSON. Он поддерживает аннотации (@JsonProperty, @JsonIgnore), автоматическое связывание с POJO и потоковую обработку.
Установка Jackson YAML
Maven:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.16.1</version>
</dependency>
Gradle:
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.16.1'
Пример: парсинг YAML в POJO
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.File;
public class JacksonYamlExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
// Чтение из файла
Config config = mapper.readValue(new File("config.yaml"), Config.class);
System.out.println("Server host: " + config.getServer().getHost());
// Чтение из строки
String yaml =