Валидация данных в Kotlin: библиотеки Kotlinx.serialization и Valiktor
数据验证是Kotlin开发中至关重要的一部分,尤其是在创建REST API、处理表单或处理传入的JSON请求时。与Python中流行的Pydantic或Marshmallow不同,Kotlin生态系统中领先的是Kotlinx.serialization(用于序列化)和Valiktor(用于声明式验证)。这些库允许在编译阶段和运行时检查数据的正确性,从而最大限度地减少错误。
为什么需要验证?
如果没有验证,应用程序可能会接受不正确的数据:空字符串、负值、没有"@"的电子邮件。这会导致数据库中出现垃圾数据、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
@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") // 通过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或Web应用程序中。
- 配置:在应用程序启动时验证properties文件。
使用Kotlinx.serialization进行基本的序列化/反序列化,使用Valiktor处理复杂的业务规则(例如,检查开始日期是否小于结束日期)。