Работа с YAML в Kotlin: библиотеки и примеры

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

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

Начать курс

Работа с YAML в Kotlin: обзор библиотек и примеры использования

YAML (YAML Ain't Markup Language) — это удобный формат сериализации данных, часто используемый для конфигурационных файлов, описания API-спецификаций (OpenAPI) и обмена данными. В экосистеме Kotlin существует несколько зрелых библиотек для работы с YAML, каждая из которых имеет свои особенности. В этой статье мы рассмотрим три основных подхода: использование SnakeYAML, kaml и kotlinx.serialization с YAML-форматом.

1. SnakeYAML — классический парсер для JVM

SnakeYAML — это самая популярная Java-библиотека для работы с YAML, которая полностью совместима с Kotlin. Она предоставляет низкоуровневый API для парсинга и создания YAML-документов.

Подключение

Добавьте зависимость в build.gradle.kts:

implementation("org.yaml:snakeyaml:2.2")

Пример: чтение YAML

Рассмотрим файл config.yaml:

server:
  host: localhost
  port: 8080
database:
  url: jdbc:postgresql://localhost/mydb
  user: admin
  password: secret

Код для парсинга:

import org.yaml.snakeyaml.Yaml
import java.io.File

fun main() {
    val yaml = Yaml()
    val inputStream = File("config.yaml").inputStream()
    val data: Map<String, Any> = yaml.load(inputStream)

    val server = data["server"] as Map<String, Any>
    println("Хост: ${server["host"]}")
    println("Порт: ${server["port"]}")

    val db = data["database"] as Map<String, Any>
    println("URL БД: ${db["url"]}")
}

Пример: создание YAML

fun createYaml() {
    val data = mapOf(
        "appName" to "MyApp",
        "version" to "1.0.0",
        "features" to listOf("auth", "logging", "metrics")
    )

    val yaml = Yaml()
    val writer = FileWriter("output.yaml")
    yaml.dump(data, writer)
    writer.close()
}

Плюсы SnakeYAML:

  • Максимальная совместимость с Java-проектами
  • Поддержка всех возможностей YAML 1.1 (якоря, теги, пользовательские типы)
  • Гибкая настройка через DumperOptions

Минусы:

  • Работает с сырыми типами Map<String, Any> — требуется приведение типов
  • Не поддерживает data-классы Kotlin "из коробки"

2. kaml — библиотека для Kotlin с поддержкой data-классов

kaml — это обёртка над SnakeYAML, которая добавляет поддержку десериализации в data-классы Kotlin и сериализации из них. Библиотека использует рефлексию Kotlin для автоматического маппинга.

Подключение

implementation("net.mamoe.yamlkt:yamlkt:0.13.0")

Пример: десериализация в data-класс

import net.mamoe.yamlkt.Yaml
import net.mamoe.yamlkt.YamlElement

data class ServerConfig(
    val host: String,
    val port: Int
)

data class AppConfig(
    val server: ServerConfig,
    val debug: Boolean = false
)

fun main() {
    val yaml = Yaml()
    val input = """
        server:
          host: "0.0.0.0"
          port: 8080
        debug: true
    """.trimIndent()

    val config = yaml.decodeFromString(AppConfig.serializer(), input)
    println("Сервер: ${config.server.host}:${config.server.port}")
    println("Режим отладки: ${config.debug}")
}

Пример: сериализация

fun serializeConfig() {
    val config = AppConfig(
        server = ServerConfig("localhost", 9090),
        debug = false
    )

    val yaml = Yaml()
    val output = yaml.encodeToString(AppConfig.serializer(), config)
    println(output)
}

Плюсы kaml:

  • Типобезопасность — работа с data-классами Kotlin
  • Поддержка значений по умолчанию (debug: false)
  • Простой API с использованием serializer()

Минусы:

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