Validación de datos en Kotlin: bibliotecas Kotlinx.serialization y Valiktor
La validación de datos es una parte crítica del desarrollo en Kotlin, especialmente al crear REST API, trabajar con formularios o procesar solicitudes JSON entrantes. A diferencia de Python, donde son populares Pydantic o Marshmallow, en el ecosistema de Kotlin lideran Kotlinx.serialization (para serialización) y Valiktor (para validación declarativa). Estas bibliotecas permiten verificar la corrección de los datos en tiempo de compilación y durante la ejecución, minimizando errores.
¿Por qué es necesaria la validación?
Sin validación, la aplicación puede aceptar datos incorrectos: cadenas vacías, valores negativos, email sin «@». Esto lleva a bases de datos con basura, errores 500 y vulnerabilidades. En Kotlin, la tipificación ayuda, pero no salva de reglas de negocio (por ejemplo, «edad de 18 a 120»). Las bibliotecas de validación permiten describir reglas de forma declarativa y reutilizarlas.
¿Cómo instalar?
Para Kotlinx.serialization, agregue en build.gradle.kts:
plugins { kotlin("plugin.serialization") version "1.9.22"}dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")}Para Valiktor (validación pura):
dependencies { implementation("org.valiktor:valiktor-core:0.12.0")}Funciones principales
- Kotlinx.serialization: anotaciones
@Serializable,@Required,@Rangepara verificación básica de campos al deserializar JSON. - Valiktor: funciones
validate,constraint, validadores personalizados, soporte para objetos anidados y colecciones. - Ambas bibliotecas funcionan con Kotlin data class y no requieren reflexión.
Ejemplo de código en Kotlin
Ejemplo simple con Kotlinx.serialization + Valiktor:
import kotlinx.serialization.*import org.valiktor.functions.*import org.valiktor.validate
@Serializabledata 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") // Validación con Valiktor validate(user) { validate(User::name).isNotEmpty() validate(User::age).isGreaterThanOrEqualTo(18) validate(User::email).matches(Regex("^[\\\\w.-]+@[\\\\w.-]+\\\\.\\\\w{2,}$")) } println("User $user pasó la validación")}Si los datos son incorrectos, Valiktor lanza una excepción con la descripción del error.
¿Cuándo usar?
- Datos de entrada de API: verificación del cuerpo de la solicitud en Ktor o Spring Boot.
- Formularios: en Android o aplicaciones web.
- Configuraciones: validación de archivos properties al iniciar la aplicación.
Use Kotlinx.serialization para serialización/deserialización básica, y Valiktor para reglas de negocio complejas (por ejemplo, verificar que la fecha de inicio sea menor que la fecha de fin).
También en la biblioteca
multierr en Go: guía completa con ejemplos prácticos
Trabajo con fechas en Rust: revisión de bibliotecas para tiempo y fechas
Monitoreo de Node.js: herramientas y bibliotecas para observabilidad