Kotlin Academy · Lección

Negociación de contenido y kotlinx.serialization

Configure la serialización JSON y deserialice automáticamente los cuerpos de las solicitudes.

Lección 3 de 413 pasos

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 y call.receive() para deserializar
  • Personalice con una instancia de Json { ... } que se pase a json()
  • Use StatusPages para gestionar correctamente los errores de deserialización
Gratis para empezar

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

  1. Configuración de un proyecto Ktor: embeddedServer y módulos de aplicación
  2. Enrutamiento y parámetros tipados
  3. Negociación de contenido y kotlinx.serialization
  4. Plugins de autenticación: JWT y sesión
← Volver a Kotlin Academy