Trabajo con JSON en Swift: análisis y serialización para principiantes
\n\nJSON (JavaScript Object Notation) es el formato de intercambio de datos más popular en aplicaciones móviles y web modernas. Si desarrollas para iOS o macOS en Swift, saber analizar y serializar JSON es una habilidad obligatoria. En este artículo, analizaremos todas las formas principales de trabajar con JSON: desde el clásico JSONSerialization hasta el moderno protocolo Codable. El material está orientado a desarrolladores principiantes que ya conocen los fundamentos de Swift.
¿Qué es JSON y por qué es necesario en Swift?
\n\nJSON es un formato de texto basado en la sintaxis de JavaScript. Representa pares "clave-valor", objetos anidados y arreglos. En el desarrollo de iOS, JSON se utiliza para:
\n\n- \n
- Obtener datos de servidores REST API \n
- Guardar configuraciones y ajustes de la aplicación \n
- Intercambiar datos entre módulos de la aplicación \n
- Trabajar con bases de datos (por ejemplo, Firebase o CoreData + JSON) \n
En Swift hay dos enfoques principales para trabajar con JSON: la forma antigua a través de JSONSerialization (de Foundation) y la moderna con los protocolos Codable, Encodable y Decodable. Comenzaremos con el más simple JSONSerialization para entender la mecánica, y luego pasaremos al potente Codable.
Análisis de JSON con JSONSerialization (Foundation)
\n\nJSONSerialization es una clase integrada en Foundation que convierte datos JSON en objetos Swift (diccionarios y arreglos). Este método existe desde las primeras versiones de Swift y todavía se usa en proyectos heredados. Veamos un ejemplo.
Supongamos que tenemos una cadena JSON con información de un usuario:
\n\nlet jsonString = """\n{\n "name": "Iván",\n "age": 30,\n "email": "ivan@example.com",\n "isActive": true,\n "hobbies": ["lectura", "programación", "deporte"]\n}\n"""\n\nPara analizar este JSON, primero convertimos la cadena en datos Data y luego usamos JSONSerialization:
import Foundation\n\nif let jsonData = jsonString.data(using: .utf8) {\n do {\n if let dictionary = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] {\n print("Nombre: \\(dictionary["name"] ?? "Sin datos")")\n print("Edad: \\(dictionary["age"] ?? "Sin datos")")\n if let hobbies = dictionary["hobbies"] as? [String] {\n print("Hobbies: \\(hobbies.joined(separator: ", "))")\n }\n }\n } catch {\n print("Error al analizar JSON: \\(error.localizedDescription)")\n }\n}\n\nPuntos importantes:
\n- \n
- Siempre usa
try-catch— el análisis puede lanzar un error. \n - El resultado llega como
Any, por lo que hay que convertirlo a un tipo específico ([String: Any]para objeto,[Any]para arreglo). \n - Las opciones
.mutableContainersy.fragmentsAllowedpermiten controlar la flexibilidad del análisis. \n
Enfoque moderno: el protocolo Codable
\n\nA partir de Swift 4, Apple presentó el protocolo Codable (combina Encodable y Decodable). Esto es una verdadera "magia": basta con declarar la estructura, y Swift sabe cómo analizar y serializar los datos. Reescribamos el ejemplo anterior usando Codable.
1. Declaración del modelo de datos
\n\nstruct User: Codable {\n let name: String\n let age: Int\n let email: String\n let isActive: Bool\n let hobbies: [String]\n}\n\nNota: los nombres de los campos en la estructura deben coincidir con las claves del JSON (las mayúsculas/minúsculas importan). Si las claves difieren (por ejemplo, snake_case), usa CodingKeys.