Procesamiento de JSON en Swift (iOS/macOS): Guía completa
JSON (JavaScript Object Notation) es el formato principal de intercambio de datos en aplicaciones modernas de iOS/macOS. Swift proporciona un potente conjunto de herramientas para trabajar con JSON, desde los protocolos integrados Codable hasta bibliotecas de terceros que simplifican el análisis y la serialización. En este artículo, analizaremos en detalle todas las formas principales de procesar JSON en Swift para las plataformas Apple.
Soporte integrado de JSON: Codable (Swift 4+)
A partir de Swift 4, Apple introdujo los protocolos Codable (que combina Encodable y Decodable), que permiten convertir automáticamente tipos de datos personalizados a JSON y viceversa sin escribir código boilerplate.
Ejemplo básico de decodificación de JSON
import Foundation
// 1. Definimos el modelo de datosstruct User: Codable { let id: Int let name: String let email: String let isActive: Bool}
// 2. Cadena JSONlet jsonString = """{ "id": 1, "name": "Iván Petrov", "email": "ivan@example.com", "isActive": true}"""
// 3. Decodificamosif 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)") }}Codificación de un objeto a JSON
let newUser = User(id: 2, name: "María Sidorova", email: "maria@example.com", isActive: false)
let encoder = JSONEncoder()encoder.outputFormatting = .prettyPrinted // para una salida legible
do { let jsonData = try encoder.encode(newUser) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("Error de codificación: \\(error)")}Trabajo con claves en snake_case y estrategias personalizadas
A menudo, el JSON llega con claves en estilo snake_case (por ejemplo, first_name), mientras que las propiedades de Swift se escriben en camelCase (firstName). Esto se resuelve con una sola línea:
decoder.keyDecodingStrategy = .convertFromSnakeCaseencoder.keyEncodingStrategy = .convertToSnakeCaseJSONSerialization — trabajo de bajo nivel
Para casos donde la estructura del JSON se desconoce de antemano o se requiere flexibilidad, se utiliza JSONSerialization de Foundation:
if let jsonData = jsonString.data(using: .utf8) { do { if let jsonDict = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { let name = jsonDict["name"] as? String ?? "" let age = jsonDict["age"] as? Int ?? 0 print("Nombre: \\(name), Edad: \\(age)") } } catch { print("Error: \\(error)") }}Este método devuelve Any, por lo que se requiere conversión de tipos. Es adecuado para datos dinámicos, pero menos seguro en cuanto a tipos.
Bibliotecas de terceros
A pesar del poder de las herramientas integradas, existen bibliotecas populares que simplifican el trabajo con JSON en Swift:
1. SwiftyJSON
Una de las bibliotecas más populares. Permite acceder a los elementos JSON mediante subíndices (subscripts) y maneja automáticamente los valores opcionales.
// Instalación a través de Swift Package Manager: https://github.com/SwiftyJSON/SwiftyJSONimport SwiftyJSON
let json = JSON(parseJSON: jsonString)let userName = json["name"].stringValuelet userEmail = json["email"].string ?? "no especificado"print("Nombre: \\(userName), Email: \\(userEmail)")
// Trabajo con objetos anidadoslet address = json["address"]["city"].stringValue2. ObjectMapper
Biblioteca para mapear JSON a objetos y viceversa. Requiere
También en la biblioteca
Trabajo con fechas en Kotlin: bibliotecas y herramientas (Kotlinx-datetime, Joda-Time, java.time)
Trabajo con archivos ZIP en C++: bibliotecas libzip y zlib
Crow C++: guía completa con ejemplos prácticos