Introducción: ¿por qué Kotlin sabe trabajar con JSON?
\n\nJSON (JavaScript Object Notation) es un formato ligero de intercambio de datos que se ha convertido en el estándar para aplicaciones web modernas y APIs. Si programas en Kotlin, ya sea para una aplicación Android o para el backend, tarde o temprano tendrás que analizar respuestas JSON del servidor o serializar tus objetos para enviarlos.
\n\nKotlin es un lenguaje moderno que funciona sobre la JVM y es completamente compatible con Java. Sin embargo, Kotlin tiene sus propias herramientas potentes para trabajar con JSON, que hacen que el código sea más conciso y seguro. En este artículo, analizaremos dos de los enfoques más populares: el uso de la biblioteca oficial kotlinx.serialization y el probado Gson.
\n\nEl artículo está dirigido a principiantes. Empezaremos con el análisis simple de una cadena, luego pasaremos a la creación de estructuras anidadas complejas y, al final, abordaremos la serialización: la conversión de tus objetos de vuelta a JSON.
\n\n1. Preparación del proyecto: dependencias e imports
\n\nAntes de escribir código, necesitas agregar las bibliotecas. Consideraremos dos opciones.
\n\n1.1. Instalación de kotlinx.serialization
\n\nEsta es la solución oficial de JetBrains. Agrega al archivo build.gradle.kts:
plugins {\n kotlin("jvm") version "1.9.0"\n kotlin("plugin.serialization") version "1.9.0"\n}\n\ndependencies {\n implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")\n}\n\n\n1.2. Instalación de Gson
\n\nGson es una biblioteca de Google. Es más fácil de configurar, pero requiere más trabajo manual:
\n\ndependencies {\n implementation("com.google.code.gson:gson:2.10.1")\n}\n\n\nDespués de sincronizar el proyecto, puedes escribir código.
\n\n2. Análisis de JSON en Kotlin con kotlinx.serialization
\n\nEste enfoque es el "más kotliniano". Declaras clases de datos y agregas la anotación @Serializable. La biblioteca generará automáticamente el código para el análisis.
2.1. Ejemplo simple: datos de usuario
\n\nSupongamos que tenemos una cadena JSON:
\n\n{\n "name": "Ana",\n "age": 25,\n "email": "anna@example.com"\n}\n\n\nCreamos el modelo:
\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\n\n@Serializable\ndata class User(\n val name: String,\n val age: Int,\n val email: String\n)\n\nfun main() {\n val jsonString = """\n {\n "name": "Ana",\n "age": 25,\n "email": "anna@example.com"\n }\n """.trimIndent()\n\n val user = Json.decodeFromString<User>(jsonString)\n println("Nombre: ${user.name}, Edad: ${user.age}")\n}\n\n\nComo puedes ver, no hay mapeos manuales, todo es automático.
\n\n2.2. Trabajo con listas y objetos anidados
\n\nLas APIs reales a menudo devuelven arrays. Agreguemos el campo address:
@Serializable\ndata class Address(\n val city: String,\n val street: String\n)\n\n@Serializable\ndata class UserWithAddress(\n val name: String,\n val age: Int,\n val address: Address\n)\n\nfun main() {\n val jsonArray = """\n [\n {"name": "Iván", "age": 30, "address": {"city": "Moscú", "street": "Tverskaya"}},\n {"name": "María", "age": 22, "address": {"city": "SPb", "street": "Nevsky"}}\n ]\n """.trimIndent()\n\n val users = Json.decodeFromString<List<UserWithAddress>>(jsonArray)\n users.forEach { println("${it.name} vive en ${it.address.city}") }\n}\n\n\nObserva: para trabajar con listas se usa el genérico List<UserWithAddress>.
3. Análisis de JSON con Gson
\n\nGson es una biblioteca clásica de Java. También funciona muy bien en Kotlin, pero requiere un poco más de código.
\n\n3.1. Análisis básico
\n\nimport com.google.gson.Gson\n\ndata cl