Trabalho com JSON em Swift: parsing e serialização para iniciantes
\n\nJSON (JavaScript Object Notation) é o formato de troca de dados mais popular em aplicativos móveis e web modernos. Se você desenvolve para iOS ou macOS em Swift, saber fazer parsing e serializar JSON é uma habilidade obrigatória. Neste artigo, abordaremos todas as principais formas de trabalhar com JSON: desde o clássico JSONSerialization até o protocolo moderno Codable. O material é voltado para desenvolvedores iniciantes que já conhecem os fundamentos do Swift.
O que é JSON e por que ele é necessário no Swift?
\n\nJSON é um formato textual baseado na sintaxe do JavaScript. Ele consiste em pares "chave-valor", objetos aninhados e arrays. No desenvolvimento iOS, o JSON é usado para:
\n\n- \n
- Obter dados de servidores REST API \n
- Salvar configurações e preferências do aplicativo \n
- Trocar dados entre módulos do aplicativo \n
- Trabalhar com bancos de dados (por exemplo, Firebase ou CoreData + JSON) \n
No Swift, existem duas abordagens principais para trabalhar com JSON: a forma antiga através do JSONSerialization (do Foundation) e a moderna, usando os protocolos Codable, Encodable e Decodable. Começaremos com o mais simples JSONSerialization para entender a mecânica e, em seguida, passaremos para o poderoso Codable.
Parsing de JSON com JSONSerialization (Foundation)
\n\nJSONSerialization é uma classe embutida no Foundation que converte dados JSON em objetos Swift (dicionários e arrays). Este método existe desde as primeiras versões do Swift e ainda é usado em projetos legados. Vamos analisar um exemplo.
Suponha que temos uma string JSON com informações de um usuário:
\n\nlet jsonString = """\n{\n "name": "Ivan",\n "age": 30,\n "email": "ivan@example.com",\n "isActive": true,\n "hobbies": ["leitura", "programação", "esporte"]\n}\n"""\n\nPara fazer o parsing deste JSON, primeiro convertemos a string em dados Data e depois usamos JSONSerialization:
import Foundation\n\nif let jsonData = jsonString.data(using: .utf8) {\n do {\n if let dictionary = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] {\n print("Nome: \\(dictionary["name"] ?? "Sem dados")")\n print("Idade: \\(dictionary["age"] ?? "Sem dados")")\n if let hobbies = dictionary["hobbies"] as? [String] {\n print("Hobbies: \\(hobbies.joined(separator: ", "))")\n }\n }\n } catch {\n print("Erro ao fazer parsing do JSON: \\(error.localizedDescription)")\n }\n}\n\nPontos importantes:
\n- \n
- Sempre use
try-catch— o parsing pode lançar um erro. \n - O resultado vem como
Any, então é necessário fazer cast para um tipo específico ([String: Any]para objeto,[Any]para array). \n - As opções
.mutableContainerse.fragmentsAllowedpermitem controlar a flexibilidade do parsing. \n
Abordagem moderna: protocolo Codable
\n\nA partir do Swift 4, a Apple apresentou o protocolo Codable (que combina Encodable e Decodable). É uma verdadeira "mágica" — basta declarar uma struct, e o Swift já sabe como fazer parsing e serializar os dados. Vamos reescrever o exemplo anterior usando Codable.
1. Declaração do modelo de dados
\n\nstruct User: Codable {\n let name: String\n let age: Int\n let email: String\n let isActive: Bool\n let hobbies: [String]\n}\n\nObserve: os nomes dos campos na struct devem coincidir com as chaves do JSON (maiúsculas/minúsculas são importantes). Se as chaves forem diferentes (por exemplo, snake_case), use CodingKeys.