Processamento JSON em Swift (iOS/macOS): Guia Completo
JSON (JavaScript Object Notation) é o formato principal de troca de dados em aplicativos iOS/macOS modernos. Swift fornece um conjunto poderoso de ferramentas para trabalhar com JSON, desde os protocolos internos Codable até bibliotecas de terceiros que simplificam o parsing e a serialização. Neste artigo, vamos detalhar todas as principais formas de processar JSON em Swift para as plataformas Apple.
Suporte interno a JSON: Codable (Swift 4+)
A partir do Swift 4, a Apple apresentou os protocolos Codable (que combina Encodable e Decodable), que permitem converter automaticamente tipos de dados personalizados para JSON e vice-versa sem escrever código boilerplate.
Exemplo básico de decodificação JSON
import Foundation
// 1. Definimos o modelo de dadosstruct User: Codable { let id: Int let name: String let email: String let isActive: Bool}
// 2. String JSONlet jsonString = """{ "id": 1, "name": "Ivan 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("Usuário: \\(user.name), email: \\(user.email)") } catch { print("Erro de decodificação: \\(error.localizedDescription)") }}Codificando um objeto para JSON
let newUser = User(id: 2, name: "Maria Sidorova", email: "maria@example.com", isActive: false)
let encoder = JSONEncoder()encoder.outputFormatting = .prettyPrinted // para saída legível
do { let jsonData = try encoder.encode(newUser) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("Erro de codificação: \\(error)")}Trabalhando com chaves em snake_case e estratégias personalizadas
Frequentemente, o JSON chega com chaves no estilo snake_case (por exemplo, first_name), enquanto as propriedades Swift são escritas em camelCase (firstName). Isso é resolvido com uma linha:
decoder.keyDecodingStrategy = .convertFromSnakeCaseencoder.keyEncodingStrategy = .convertToSnakeCaseJSONSerialization — trabalho de baixo nível
Para casos onde a estrutura do JSON é desconhecida antecipadamente ou é necessária flexibilidade, usa-se JSONSerialization do 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("Nome: \\(name), Idade: \\(age)") } } catch { print("Erro: \\(error)") }}Este método retorna Any, portanto é necessário fazer type casting. Adequado para dados dinâmicos, mas menos seguro em termos de tipos.
Bibliotecas de terceiros
Apesar do poder das ferramentas internas, existem bibliotecas populares que simplificam o trabalho com JSON em Swift:
1. SwiftyJSON
Uma das bibliotecas mais populares. Permite acessar elementos JSON através de subscritos (subscripts) e lida automaticamente com valores opcionais.
// Instalação via Swift Package Manager: https://github.com/SwiftyJSON/SwiftyJSONimport SwiftyJSON
let json = JSON(parseJSON: jsonString)let userName = json["name"].stringValuelet userEmail = json["email"].string ?? "não informado"print("Nome: \\(userName), Email: \\(userEmail)")
// Trabalhando com objetos aninhadoslet address = json["address"]["city"].stringValue2. ObjectMapper
Biblioteca para mapeamento de JSON para objetos e vice-versa. Requer
Também na biblioteca
Tokens JWT em Rust: bibliotecas e implementação de autenticação
Event Bus e o padrão Observer em Java: implementação de arquitetura fracamente acoplada
Cliente Elasticsearch para Rust: visão geral da biblioteca elasticsearch-rs
Monitoramento de aplicações C# (.NET) com AppMetrics