Introducción: por qué JSON es la base del desarrollador moderno de Kotlin
JSON (JavaScript Object Notation) sigue siendo el estándar de facto para el intercambio de datos entre el servidor y el cliente, ya sea una aplicación móvil en Android o un backend en Ktor. En el ecosistema de Kotlin, trabajar con JSON es especialmente cómodo gracias al tipado estricto del lenguaje y a las potentes bibliotecas de serialización. En este artículo, analizaremos dos enfoques principales: el uso de la biblioteca oficial kotlinx.serialization y la popular Gson. Aprenderá a analizar estructuras complejas, serializar objetos y manejar excepciones en la práctica.
Preparación del proyecto y adición de dependencias
Antes de escribir código, es necesario añadir las bibliotecas al archivo build.gradle.kts (para Gradle). Veamos ambas opciones.
Opción 1: kotlinx.serialization (recomendada)
- Añada el plugin en
plugins:kotlin("plugin.serialization") version "1.9.22" - En
dependenciesespecifique:implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")
Opción 2: Gson (para compatibilidad con proyectos Java)
- En
dependenciesañada:implementation("com.google.code.gson:gson:2.10.1")
// build.gradle.kts — ejemplo completo para kotlinx.serializationplugins { kotlin("jvm") version "1.9.22" kotlin("plugin.serialization") version "1.9.22"}
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")}Análisis de JSON en Kotlin: de lo simple a lo complejo
El análisis (deserialización) es la conversión de una cadena JSON en un objeto Kotlin. Veámoslo con un ejemplo de datos de usuario.
Ejemplo de datos
{ "id": 123, "name": "Ana", "email": "ana@example.com", "active": true}Creación de la Data Class
Para ambas bibliotecas se utiliza la misma clase. Importante: para kotlinx.serialization es necesario añadir la anotación @Serializable.
import kotlinx.serialization.Serializable
@Serializabledata class User( val id: Int, val name: String, val email: String, val active: Boolean)Análisis con kotlinx.serialization
import kotlinx.serialization.json.Json
fun parseWithKotlinx(jsonString: String): User { val json = Json { ignoreUnknownKeys = true } // ignoramos campos desconocidos return json.decodeFromString<User>(jsonString)}
// Uso:fun main() { val json = """{"id":123,"name":"Ana","email":"ana@example.com","active":true}""" val user = parseWithKotlinx(json) println(user.name) // Ana}Análisis con Gson
import com.google.gson.Gson
fun parseWithGson(jsonString: String): User { val gson = Gson() return gson.fromJson(jsonString, User::class.java)}
// Uso:fun main() { val json = """{"id":123,"name":"Ana","email":"ana@example.com","active":true}""" val user = parseWithGson(json) println(user.email) // ana@example.com}Serialización: convertimos un objeto en JSON
El proceso inverso —crear una cadena JSON a partir de un objeto— es igualmente importante para enviar datos al servidor.
Serialización con kotlinx.serialization
import kotlinx.serialization.encodeToString
fun serializeWithKotlinx(user: User): String { val json = Json { prettyPrint = true } return json.encodeToString(user)}
// Resultado:// {// "id": 123,// "name": "Ana",// "email": "ana@example.com",// "active": true// }Serialización con Gson
fun serializeWithGson(user: User): String { val gson = GsonBuilder().setPrettyPrinting().create() return gson.toJson(user)}<