Negociación de contenido y kotlinx.serialization
Configure la serialización JSON y deserialice automáticamente los cuerpos de las solicitudes.
Negociación de contenido y kotlinx.serialization es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué es la negociación de contenido?
La negociación de contenido es el mecanismo HTTP mediante el cual un cliente y un servidor acuerdan el formato del cuerpo de la respuesta. El cliente envía una cabecera Accept y el servidor elige el formato que mejor coincide. El complemento ContentNegotiation de Ktor automatiza este proceso.
Adición de dependencias
Añada el complemento ContentNegotiation y el convertidor JSON de kotlinx.serialization:
dependencies {
implementation("io.ktor:ktor-server-content-negotiation:2.3.12")
implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.12")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1")
}Instalación de ContentNegotiation
Instale el complemento en un módulo de Application y registre el convertidor JSON:
import io.ktor.server.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.json.*
fun Application.configureSerialization() {
install(ContentNegotiation) {
json()
}
}Clases de datos @Serializable
Anote sus clases de datos con @Serializable de kotlinx.serialization. El complemento del compilador de Kotlin genera el serializador durante la compilación; no se necesita reflexión en tiempo de ejecución:
import kotlinx.serialization.Serializable
@Serializable
data class User(val id: Long, val name: String, val email: String)Respuesta con un objeto serializable
Una vez instalado ContentNegotiation, pase cualquier objeto @Serializable a call.respond(). Ktor lo serializa automáticamente a JSON:
get("/users/{id}") {
val user = User(1L, "Alice", "alice@example.com")
call.respond(user) // serialized to JSON
}Recepción de un objeto serializable
Utilice call.receive para deserializar el cuerpo de la solicitud en una clase @Serializable. Si el cuerpo tiene un formato incorrecto, Ktor lanza una ContentTransformationException:
post("/users") {
val newUser = call.receive<User>()
call.respond(HttpStatusCode.Created, newUser)
}Personalización de la configuración JSON
Pase una instancia de Json a json() para personalizar la serialización: ignorar claves desconocidas, imprimir con formato, utilizar el modo flexible, etc.:
install(ContentNegotiation) {
json(Json {
prettyPrint = true
isLenient = true
ignoreUnknownKeys = true
})
}Varios tipos de contenido
Registre varios convertidores para admitir distintos tipos de Accept. Ktor elige el primero que coincide con la cabecera Accept del cliente:
install(ContentNegotiation) {
json()
// xml() with ktor-serialization-kotlinx-xml if needed
}Serialización de listas y mapas
Envuelva las colecciones en un objeto de respuesta o utilice directamente call.respond(list). kotlinx.serialization gestiona List, Map y los genéricos anidados siempre que los tipos de los elementos sean @Serializable:
get("/users") {
val users = listOf(
User(1, "Alice", "a@example.com"),
User(2, "Bob", "b@example.com")
)
call.respond(users)
}Serializadores personalizados
Para tipos que no controla (por ejemplo, java.time.Instant), implemente un KSerializer y regístrelo mediante @Serializable(with = MySerializer::class) o mediante un módulo de serializador contextual:
val module = SerializersModule {
contextual(Instant::class, InstantSerializer)
}
install(ContentNegotiation) {
json(Json { serializersModule = module })
}Gestión de errores de deserialización
Instale el plugin StatusPages para devolver una respuesta de error limpia cuando falle call.receive:
install(StatusPages) {
exception<ContentTransformationException> { call, _ ->
call.respond(HttpStatusCode.BadRequest, "Invalid request body")
}
}Comprobación rápida
¿Qué anotación es necesaria en una clase de datos de Kotlin para que kotlinx.serialization pueda serializarla?
Resumen: Content Negotiation y kotlinx.serialization
Puntos clave:
- Instale
ContentNegotiation+json()para serializar y deserializar JSON automáticamente - Anote las clases de datos con
@Serializable - Use
call.respond(obj)para serializar ycall.receivepara deserializar() - Personalice con una instancia de
Json { ... }que se pase ajson() - Use
StatusPagespara gestionar correctamente los errores de deserialización
Aprende Kotlin con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 51
- Lecciones
- 203
Preguntas frecuentes
¿La lección «Negociación de contenido y kotlinx.serialization» es gratis?
Sí — el texto completo de «Negociación de contenido y kotlinx.serialization» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Negociación de contenido y kotlinx.serialization»?
Configure la serialización JSON y deserialice automáticamente los cuerpos de las solicitudes. Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Kotlin Academy?
No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Negociación de contenido y kotlinx.serialization»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?
Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Configuración de un proyecto Ktor: embeddedServer y módulos de aplicación
- Enrutamiento y parámetros tipados
- Negociación de contenido y kotlinx.serialization
- Plugins de autenticación: JWT y sesión