Procesamiento de JSON en Swift: Codable, Foundation y SwiftyJSON para iOS/macOS

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

Procesamiento de JSON en Swift (iOS/macOS): guía completa



JSON (JavaScript Object Notation) es uno de los formatos de intercambio de datos más populares en las aplicaciones modernas. En el ecosistema de Apple (iOS, macOS, watchOS, tvOS), Swift proporciona varias formas potentes de trabajar con JSON. En este artículo, analizaremos tres enfoques principales: el nativo Codable, el de bajo nivel JSONSerialization y la popular librería de terceros SwiftyJSON. Aprenderás a analizar, crear y procesar JSON en Swift con ejemplos de código.



1. Codable — el estándar moderno de Swift



A partir de Swift 4, Apple introdujo los protocolos Codable (que combina Encodable y Decodable). Esta es la forma más conveniente y segura en cuanto a tipos de trabajar con JSON. Solo necesitas declarar una estructura o clase que cumpla con Codable y usar JSONEncoder/JSONDecoder.



Ejemplo: análisis de JSON desde una respuesta de API



import Foundation

// Definimos el modelo, que cumple automáticamente con Codablestruct User: Codable { let id: Int let name: String let email: String let isActive: Bool}

// Ejemplo de cadena JSONlet jsonString = """{ "id": 42, "name": "Iván Petrov", "email": "ivan@example.com", "isActive": true}"""

// Análisisif let jsonData = jsonString.data(using: .utf8) { let decoder = JSONDecoder() do { let user = try decoder.decode(User.self, from: jsonData) print("Usuario: \\(user.name), email: \\(user.email)") } catch { print("Error de decodificación: \\(error.localizedDescription)") }}


Ejemplo: creación de JSON a partir de un objeto



let user = User(id: 1, name: "Ana Smirnova", email: "anna@test.com", isActive: false)let encoder = JSONEncoder()encoder.outputFormatting = .prettyPrinted // para un formato bonito

if let jsonData = try? encoder.encode(user), let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString)}


Trabajo con estructuras anidadas y arreglos



struct Company: Codable {    let name: String    let employees: [User]}

let companyJson = """{ "name": "TechCorp", "employees": [ {"id": 1, "name": "Oleg", "email": "oleg@tc.com", "isActive": true}, {"id": 2, "name": "María", "email": "maria@tc.com", "isActive": false} ]}"""

if let data = companyJson.data(using: .utf8), let company = try? JSONDecoder().decode(Company.self, from: data) { print("Empresa: \\(company.name), empleados: \\(company.employees.count)")}


2. JSONSerialization — el enfoque clásico (Foundation)



Antes de la llegada de Codable, la herramienta principal era JSONSerialization de Foundation. Funciona con diccionarios y arreglos de Foundation ([String: Any] y [Any]). Este método es útil cuando la estructura del JSON no se conoce de antemano o es muy dinámica.



Ejemplo: análisis con JSONSerialization



if let data = jsonString.data(using: .utf8) {    do {        if let dict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {            let id = dict["id"] as? Int ?? 0            let name = dict["name"] as? String ?? "Desconocido"            print("ID: \\(id), Nombre: \\(name)")        }    } catch {        print("Error: \\(error)")    }}


Desventaja: falta de seguridad de tipos: es necesario convertir los tipos manualmente, lo que puede provocar errores en tiempo de ejecución. Se recomienda usar Codable siempre que sea posible.



3. SwiftyJSON — una práctica librería de terceros



SwiftyJSON es una popular librería de código abie

Recommendations