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

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

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

Начать курс

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

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