Processamento JSON em Swift (iOS/macOS): do básico ao uso avançado
JSON (JavaScript Object Notation) é um dos formatos de troca de dados mais populares no desenvolvimento móvel e desktop. No ecossistema Swift (iOS/macOS), o trabalho com JSON é implementado de forma nativa e elegante, desde o protocolo Codable (Swift 4+) até o JSONSerialization de baixo nível do Foundation. Neste artigo, abordaremos todas as principais abordagens, mostraremos exemplos de código e daremos recomendações práticas para o site educacional pythonlib.ru.
1. Fundamentos: o protocolo Codable
O protocolo Codable é uma combinação de Encodable e Decodable. Ele gera automaticamente o código para converter suas estruturas e classes em JSON e vice-versa. Esta é a forma principal e recomendada de trabalhar com JSON no Swift moderno.
1.1. Modelo de dados simples
import Foundation
struct User: Codable { let id: Int let name: String let email: String let isActive: Bool}
// Exemplo de string JSONlet jsonString = """{ "id": 1, "name": "Ivan Petrov", "email": "ivan@example.com", "isActive": true}"""
// Decodificaçãoif let jsonData = jsonString.data(using: .utf8) { let decoder = JSONDecoder() if let user = try? decoder.decode(User.self, from: jsonData) { print("Usuário: \\(user.name), email: \\(user.email)") }}1.2. Chaves personalizadas (CodingKeys)
Se as chaves no JSON diferirem das propriedades do modelo (por exemplo, snake_case no JSON, camelCase no Swift), use a enumeração CodingKeys:
struct Product: Codable { let productId: Int let productName: String let price: Double
enum CodingKeys: String, CodingKey { case productId = "product_id" case productName = "product_name" case price }}
let jsonProduct = """{ "product_id": 101, "product_name": "MacBook Pro", "price": 2499.99}"""2. Trabalhando com arrays e objetos aninhados
O JSON frequentemente contém arrays de objetos ou estruturas aninhadas. O Codable lida com isso sem dificuldade:
struct Author: Codable { let name: String let books: [Book]}
struct Book: Codable { let title: String let year: Int}
let jsonLibrary = """{ "name": "J.K. Rowling", "books": [ {"title": "Harry Potter e a Pedra Filosofal", "year": 1997}, {"title": "Harry Potter e a Câmara Secreta", "year": 1998} ]}"""
if let data = jsonLibrary.data(using: .utf8) { let author = try? JSONDecoder().decode(Author.self, from: data) print("Autor: \\(author?.name ?? ""), livros: \\(author?.books.count ?? 0)")}3. JSONSerialization — abordagem de baixo nível
Embora o Codable seja a forma preferida, às vezes é necessário trabalhar com dados dinâmicos ou não estruturados. Nesses casos, use o JSONSerialization do Foundation:
let jsonString = """{ "status": "success", "data": { "temperature": 22.5, "humidity": 65, "city": "Moscou" }}"""
if let data = jsonString.data(using: .utf8) { do { if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { if let status = json["status"] as? String { print("Status: \\(status)") } if let dataDict = json["data"] as? [String: Any], let temp = dataDict["temperature"] as? Double { print("Temperatura: \\(temp)°C") } } } catch { print("Erro ao fazer parsing do JSON: \\(error.localizedDescription)") }}4. Tratamento de erros e valores opcionais
Dados JSON reais
Também na biblioteca
Configuração de aplicações em Go: melhores práticas e ferramentas
Biblioteca Padrão TypeScript: guia completo para desenvolvedores
ORM para PHP: comparação entre Doctrine, Eloquent e Cycle — exemplos de código
Processamento JSON em C++: bibliotecas, parsing e serialização de dados