Kotlinx.serialization и Valiktor: валидация данных в Kotlin

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

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

Начать курс

Валидация данных в Kotlin: библиотеки Kotlinx.serialization и Valiktor

Валидация данных — критически важная часть разработки на Kotlin, особенно при создании REST API, работе с формами или обработке входящих JSON-запросов. В отличие от Python, где популярны Pydantic или Marshmallow, в Kotlin экосистеме лидируют Kotlinx.serialization (для сериализации) и Valiktor (для декларативной валидации). Эти библиотеки позволяют проверять корректность данных на этапе компиляции и во время выполнения, минимизируя ошибки.

Зачем нужна валидация?

Без валидации приложение может принять некорректные данные: пустые строки, отрицательные значения, email без «@». Это приводит к базам данных с мусором, ошибкам 500 и уязвимостям. В Kotlin типизация помогает, но не спасает от бизнес-правил (например, «возраст от 18 до 120»). Библиотеки валидации позволяют описать правила декларативно и переиспользовать их.

Как установить?

Для Kotlinx.serialization добавьте в build.gradle.kts:

plugins {
    kotlin("plugin.serialization") version "1.9.22"
}
dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")
}

Для Valiktor (чистая валидация):

dependencies {
    implementation("org.valiktor:valiktor-core:0.12.0")
}

Основные функции

  • Kotlinx.serialization: аннотации @Serializable, @Required, @Range для базовой проверки полей при десериализации JSON.
  • Valiktor: функции validate, constraint, кастомные валидаторы, поддержка вложенных объектов и коллекций.
  • Обе библиотеки работают с Kotlin data class и не требуют рефлексии.

Пример кода на Kotlin

Простейший пример с Kotlinx.serialization + Valiktor:

import kotlinx.serialization.*
import org.valiktor.functions.*
import org.valiktor.validate

@Serializable
data class User(
    @Required val name: String,
    @Range(from = 18, to = 120) val age: Int,
    val email: String
)

fun main() {
    val user = User("Alice", 25, "alice@example.com")
    
    // Валидация через Valiktor
    validate(user) {
        validate(User::name).isNotEmpty()
        validate(User::age).isGreaterThanOrEqualTo(18)
        validate(User::email).matches(Regex("^[\\w.-]+@[\\w.-]+\\.\\w{2,}$"))
    }
    
    println("User $user прошел валидацию")
}

Если данные некорректны, Valiktor выбрасывает исключение с описанием ошибки.

Когда использовать?

  • Входные данные API: проверка тела запроса в Ktor или Spring Boot.
  • Формы: в Android или веб-приложениях.
  • Конфигурации: валидация properties-файлов при старте приложения.

Используйте Kotlinx.serialization для базовой сериализации/десериализации, а Valiktor — для сложных бизнес-правил (например, проверка, что дата начала меньше даты окончания).

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