Traitement JSON en Swift (iOS/macOS) : Guide complet
JSON (JavaScript Object Notation) est le format d'échange de données principal dans les applications iOS/macOS modernes. Swift fournit un ensemble puissant d'outils pour travailler avec JSON, allant des protocoles intégrés Codable aux bibliothèques tierces simplifiant l'analyse et la sérialisation. Dans cet article, nous allons détailler toutes les principales méthodes de traitement JSON en Swift pour les plateformes Apple.
Prise en charge intégrée de JSON : Codable (Swift 4+)
Depuis Swift 4, Apple a introduit les protocoles Codable (combinant Encodable et Decodable), qui permettent de convertir automatiquement des types de données personnalisés en JSON et vice versa sans écrire de code passe-partout.
Exemple de base de décodage JSON
import Foundation
// 1. Définir le modèle de donnéesstruct User: Codable { let id: Int let name: String let email: String let isActive: Bool}
// 2. Chaîne JSONlet jsonString = """{ "id": 1, "name": "Ivan Petrov", "email": "ivan@example.com", "isActive": true}"""
// 3. Décoderif let jsonData = jsonString.data(using: .utf8) { let decoder = JSONDecoder() do { let user = try decoder.decode(User.self, from: jsonData) print("Utilisateur : \\(user.name), email : \\(user.email)") } catch { print("Erreur de décodage : \\(error.localizedDescription)") }}Encodage d'un objet en JSON
let newUser = User(id: 2, name: "Maria Sidorova", email: "maria@example.com", isActive: false)
let encoder = JSONEncoder()encoder.outputFormatting = .prettyPrinted // pour une sortie lisible
do { let jsonData = try encoder.encode(newUser) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("Erreur d'encodage : \\(error)")}Travail avec les clés en snake_case et stratégies personnalisées
Souvent, le JSON arrive avec des clés en style snake_case (par exemple, first_name), tandis que les propriétés Swift sont écrites en camelCase (firstName). Cela se résout en une seule ligne :
decoder.keyDecodingStrategy = .convertFromSnakeCaseencoder.keyEncodingStrategy = .convertToSnakeCaseJSONSerialization — travail de bas niveau
Pour les cas où la structure JSON est inconnue à l'avance ou nécessite de la flexibilité, on utilise 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("Nom : \\(name), Âge : \\(age)") } } catch { print("Erreur : \\(error)") }}Cette méthode retourne Any, donc un transtypage est nécessaire. Elle convient pour les données dynamiques, mais est moins sûre au niveau des types.
Bibliothèques tierces
Malgré la puissance des outils intégrés, il existe des bibliothèques populaires qui simplifient le travail avec JSON en Swift :
1. SwiftyJSON
L'une des bibliothèques les plus populaires. Elle permet d'accéder aux éléments JSON via des indices (subscripts) et gère automatiquement les valeurs optionnelles.
// Installation via Swift Package Manager : https://github.com/SwiftyJSON/SwiftyJSONimport SwiftyJSON
let json = JSON(parseJSON: jsonString)let userName = json["name"].stringValuelet userEmail = json["email"].string ?? "non spécifié"print("Nom : \\(userName), Email : \\(userEmail)")
// Travail avec des objets imbriquéslet address = json["address"]["city"].stringValue2. ObjectMapper
Bibliothèque pour le mapping JSON vers les objets et vice versa. Nécessite d