Introducción al Trabajo con JSON en Kotlin
JSON (Notación de Objetos JavaScript) es uno de los formatos más populares para el intercambio de datos entre un servidor y un cliente. En el desarrollo moderno con Kotlin, ya sea en aplicaciones Android o proyectos del lado del servidor, la capacidad de trabajar eficientemente con JSON es una habilidad esencial. En este artículo, examinaremos a fondo cómo realizar el análisis y la serialización de JSON en Kotlin utilizando las bibliotecas más populares: kotlinx.serialization y Gson.
Ya sea que estés creando una API REST, procesando respuestas de servicios externos o guardando configuraciones locales, comprender los principios del trabajo con JSON te ayudará a escribir un código más limpio y eficiente.
Fundamentos del Análisis de JSON en Kotlin
¿Qué son la Serialización y la Deserialización?
Antes de pasar al código, es importante entender dos conceptos clave:
- Serialización — convertir un objeto de Kotlin (clase de datos, lista, etc.) en una cadena JSON.
- Deserialización (Análisis) — el proceso inverso: crear un objeto de Kotlin a partir de una cadena JSON.
Kotlin no tiene soporte JSON integrado, por lo que utilizamos bibliotecas de terceros. Veamos las dos más populares.
La Biblioteca kotlinx.serialization
kotlinx.serialization es una biblioteca oficial de JetBrains que se integra perfectamente con el lenguaje Kotlin. Funciona en tiempo de compilación, lo que garantiza un alto rendimiento y seguridad de tipos.
Añadiendo la Biblioteca
Primero, agrega el plugin a build.gradle.kts:
plugins { kotlin("plugin.serialization") version "1.9.22"}
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")}Definiendo el Modelo de Datos
Vamos a crear una clase para representar un usuario:
import kotlinx.serialization.Serializable
@Serializabledata class User( val name: String, val age: Int, val email: String? = null, // campo anulable val roles: List<String> = emptyList())La anotación @Serializable le indica al compilador que esta clase puede ser serializada.
Serialización (Objeto → JSON)
import kotlinx.serialization.encodeToStringimport kotlinx.serialization.json.Json
fun main() { val user = User( name = "Ana", age = 28, email = "ana@ejemplo.com", roles = listOf("admin", "user") )
val jsonString = Json.encodeToString(user) println(jsonString) // {"name":"Ana","age":28,"email":"ana@ejemplo.com","roles":["admin","user"]}}Deserialización (JSON → Objeto)
import kotlinx.serialization.decodeFromString
fun main() { val json = """{"name":"Iván","age":35,"roles":["user"]}""" val user = Json.decodeFromString<User>(json) println(user.name) // Iván println(user.email) // null (no especificado en JSON)}Configurando Ajustes de Json
Puedes personalizar el comportamiento del analizador:
val json = Json { prettyPrint = true // formato bonito ignoreUnknownKeys = true // ignorar campos adicionales en JSON isLenient = true // permitir análisis indulgente (ej., comillas)}
val user = json.decodeFromString<User>(jsonString)La Biblioteca Gson
Gson de Google es otra biblioteca popular, especialmente común en el desarrollo de Android.
Añadiendo Gson
dependencies { implementation("com.google.code.gson:gson:2.10.1")}Ejemplo de Uso
import com.google.gson.Gson
data class Product( val id: Int, val title: String, val price: Double)
fun main() { val gson = Gson() val product = Product(1, "Laptop", 999.99) // Serialización val json = gson.toJson(product) println(json) // {"id":1,"title":"Laptop","price":999.99} // Deserialización val jsonString = """{"id":2,"title":"Ratón","price":25.50}""" val parsedProduct = gson.fromJson(jsonString, Product::class.java) println(parsedProduct.title) // Ratón}