Trabajo con JSON en Swift: análisis y serialización de datos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajando con JSON en Swift: Análisis y Serialización



JSON (JavaScript Object Notation) se ha convertido en el estándar de facto para el intercambio de datos entre cliente y servidor en aplicaciones móviles y de escritorio. En el ecosistema Swift (iOS/macOS), trabajar con JSON está implementado al más alto nivel — desde el simple JSONSerialization hasta el potente protocolo Codable. En este artículo, cubriremos todas las formas principales de analizar y serializar JSON en Swift, proporcionaremos ejemplos prácticos y mostraremos cómo evitar errores comunes.



1. Conceptos Básicos de Trabajar con JSON en Swift: JSONSerialization



Antes de Swift 4, la herramienta principal para trabajar con JSON era la clase JSONSerialization, que forma parte de Foundation. Permite convertir datos JSON en objetos de Swift (diccionarios, arreglos, cadenas, números) y viceversa. Este método sigue siendo relevante si necesitas control total sobre el proceso o trabajas con código heredado.



Analizando JSON con JSONSerialization



Supongamos que recibimos una cadena JSON del servidor:



let jsonString = """{    "name": "Ivan",    "age": 30,    "isPremium": true,    "hobbies": ["reading", "running", "programming"]}"""

guard let jsonData = jsonString.data(using: .utf8) else { fatalError("Error encoding string to Data")}

do { if let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { let name = jsonObject["name"] as? String ?? "" let age = jsonObject["age"] as? Int ?? 0 let isPremium = jsonObject["isPremium"] as? Bool ?? false let hobbies = jsonObject["hobbies"] as? [String] ?? [] print("Name: \\(name), Age: \\(age), Premium: \\(isPremium), Hobbies: \\(hobbies)") }} catch { print("JSON parsing error: \\(error.localizedDescription)")}


La desventaja de este enfoque es la necesidad de convertir tipos manualmente y manejar valores opcionales. El código se vuelve voluminoso y propenso a errores.



Serialización a JSON con JSONSerialization



El proceso inverso — convertir un diccionario de Swift en datos JSON:



let personDict: [String: Any] = [    "name": "Maria",    "age": 25,    "isPremium": false,    "hobbies": ["drawing", "yoga"]]

do { let jsonData = try JSONSerialization.data(withJSONObject: personDict, options: .prettyPrinted) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("Serialization error: \\(error.localizedDescription)")}


La opción .prettyPrinted hace que la salida sea legible para humanos. Para producción, normalmente se usa [] (sin formato) para ahorrar ancho de banda.



2. Enfoque Moderno: Protocolo Codable y JSONDecoder



A partir de Swift 4, trabajar con JSON se ha vuelto mucho más fácil gracias al protocolo Codable (que combina Encodable y Decodable). Simplemente describes la estructura de datos, y el compilador genera automáticamente el código para codificar/decodificar.



Analizando JSON con JSONDecoder



Definamos un modelo para nuestro JSON:



struct Person: Codable {    let name: String    let age: Int    let isPremium: Bool    let hobbies: [String]}

let jsonString = """{ "name": "Ivan", "age": 30, "isPremium": true, "hobbies": ["reading", "running", "programming"]}"""

guard let jsonData = jsonString.data(using: .utf8) else { fatalError("Error encoding string")}

do { let person = try JSONDecoder().decode(Person.self, from: jsonData) print("Name: \\(person.name), Age: \\(person.age), Premium: \\(person.isPremium), Hobbies: \\(person.hobbies)")} catch { print("Decoding error: \\(error.localizedDescription)")}


Como puedes ver, el código se ha vuelto mucho más limpio. Toda la conversión de tipos y las comprobaciones

Blogs

Book Recommendations