Валидация данных в 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 — для сложных бизнес-правил (например, проверка, что дата начала меньше даты окончания).
Также в библиотеке
CLI фреймворк для Rust: Clap — мощный и удобный инструмент для создания консольных приложений
CameraX для Kotlin: полное руководство с примерами
node-cache: Простое и эффективное кэширование в Node.js
WebSocket библиотека Kotlin: ktor-client-websockets для реального времени