Работа с YAML в Java: библиотеки SnakeYAML и Jackson

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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 =                    

Рекомендаций