Travailler avec JSON en Swift : parsing et sérialisation en pratique
\n\nJSON (JavaScript Object Notation) est un format léger d'échange de données qui est devenu le standard de facto pour l'interaction entre le client et le serveur dans le développement mobile et web. Dans l'écosystème Apple (iOS, macOS, watchOS, tvOS), le travail avec JSON s'effectue via de puissants mécanismes intégrés. Dans cet article, nous allons détailler comment parser et sérialiser du JSON en Swift avec des exemples concrets, en utilisant à la fois le protocole moderne Codable et le classique JSONSerialization.
Cet article est destiné aux développeurs qui connaissent déjà les bases de Swift et souhaitent travailler en toute confiance avec les requêtes réseau et le stockage local de données au format JSON.
\n\n1. Bases de JSON et sa place dans les applications Swift
\n\nJSON est un format textuel basé sur deux structures : les objets (ensembles de paires clé-valeur) et les tableaux (listes ordonnées). En Swift, ces structures correspondent à Dictionary et Array. Les types de données en JSON sont limités : chaînes, nombres, valeurs booléennes, null, objets et tableaux.
Un scénario typique d'utilisation de JSON dans une application iOS/macOS se présente comme suit :
\n- \n
- Récupération d'une chaîne JSON depuis le serveur (via URLSession). \n
- Parsing du JSON en modèles Swift (par exemple, structures ou classes). \n
- Traitement des données et affichage dans l'interface. \n
- Sérialisation (transformation inverse) des modèles en JSON pour envoi au serveur. \n
Apple propose deux approches principales pour travailler avec JSON : JSONSerialization (bas niveau mais flexible) et Codable (haut niveau, type-safe, recommandé depuis Swift 4+).
2. Parsing JSON avec Codable (méthode recommandée)
\n\nLe protocole Codable combine Encodable (pour la sérialisation) et Decodable (pour le parsing). C'est la manière la plus simple et la plus sûre de travailler avec JSON en Swift.
Exemple 1 : Parsing d'un objet JSON simple
\n\nSupposons que le serveur renvoie le JSON suivant :
\n{\n "userId": 1,\n "id": 1,\n "title": "Exemple de tâche",\n "completed": false\n}\n\nCréons une structure de modèle conforme à Codable :
struct TodoItem: Codable {\n let userId: Int\n let id: Int\n let title: String\n let completed: Bool\n}\n\nMaintenant, effectuons le parsing de la chaîne JSON :
\nlet jsonString = """\n{\n "userId": 1,\n "id": 1,\n "title": "Exemple de tâche",\n "completed": false\n}\n"""\n\nif let jsonData = jsonString.data(using: .utf8) {\n let decoder = JSONDecoder()\n do {\n let todo = try decoder.decode(TodoItem.self, from: jsonData)\n print("Tâche : \\(todo.title), terminée : \\(todo.completed)")\n } catch {\n print("Erreur de parsing : \\(error.localizedDescription)")\n }\n}\n\nExemple 2 : Parsing d'un tableau d'objets
\n\nSi le serveur renvoie un tableau de tâches :
\n[\n {"userId": 1, "id": 1, "title": "Tâche 1", "completed": false},\n {"userId": 1, "id": 2, "title": "Tâche 2", "completed": true}\n]\n\nLe parsing se fait tout aussi simplement — il suffit de spécifier le type du tableau :
\nlet todoArray = try decoder.decode([TodoItem].self, from: jsonData)\n\n2.1. Clés personnalisées et snake_case
\n\nSouvent, JSON utilise le format snake_case (par exemple, user_id), tandis qu'en Swift on utilise camelCase (userId). JSONDecoder peut convertir automatiquement les clés :
decoder.keyDecodingStrategy = .convertFromSnakeCase\n\nSi vous devez définir une correspondance non standard, utilisez l'énumération CodingKeys :
struct User: Codable {\n let fullName: String\n let emailAddress: String\n\n enum CodingKeys: