Traitement JSON en Swift (iOS/macOS) : des bases à l'utilisation avancée
JSON (JavaScript Object Notation) est l'un des formats d'échange de données les plus populaires dans le développement mobile et desktop. Dans l'écosystème Swift (iOS/macOS), le travail avec JSON est implémenté de manière native et élégante, depuis le protocole Codable (Swift 4+) jusqu'au JSONSerialization de bas niveau de Foundation. Dans cet article, nous allons passer en revue toutes les approches clés, montrer des exemples de code et donner des recommandations pratiques pour le site éducatif pythonlib.ru.
1. Les bases : le protocole Codable
Le protocole Codable est une combinaison de Encodable et Decodable. Il génère automatiquement le code pour convertir vos structures et classes en JSON et vice versa. C'est la méthode principale et recommandée pour travailler avec JSON en Swift moderne.
1.1. Modèle de données simple
import Foundation
struct User: Codable { let id: Int let name: String let email: String let isActive: Bool}
// Exemple de chaîne JSONlet jsonString = """{ "id": 1, "name": "Иван Петров", "email": "ivan@example.com", "isActive": true}"""
// Décodageif let jsonData = jsonString.data(using: .utf8) { let decoder = JSONDecoder() if let user = try? decoder.decode(User.self, from: jsonData) { print("Utilisateur : \\(user.name), email : \\(user.email)") }}1.2. Clés personnalisées (CodingKeys)
Si les clés dans le JSON diffèrent des propriétés du modèle (par exemple, snake_case dans JSON, camelCase en Swift), utilisez l'énumération 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. Travailler avec des tableaux et des objets imbriqués
Le JSON contient souvent des tableaux d'objets ou des structures imbriquées. Codable gère cela sans difficulté :
struct Author: Codable { let name: String let books: [Book]}
struct Book: Codable { let title: String let year: Int}
let jsonLibrary = """{ "name": "Джоан Роулинг", "books": [ {"title": "Гарри Поттер и философский камень", "year": 1997}, {"title": "Гарри Поттер и Тайная комната", "year": 1998} ]}"""
if let data = jsonLibrary.data(using: .utf8) { let author = try? JSONDecoder().decode(Author.self, from: data) print("Auteur : \\(author?.name ?? ""), livres : \\(author?.books.count ?? 0)")}3. JSONSerialization — approche de bas niveau
Bien que Codable soit la méthode préférée, il est parfois nécessaire de travailler avec des données dynamiques ou non structurées. Dans ce cas, utilisez JSONSerialization de Foundation :
let jsonString = """{ "status": "success", "data": { "temperature": 22.5, "humidity": 65, "city": "Москва" }}"""
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("Statut : \\(status)") } if let dataDict = json["data"] as? [String: Any], let temp = dataDict["temperature"] as? Double { print("Température : \\(temp)°C") } } } catch { print("Erreur d'analyse JSON : \\(error.localizedDescription)") }}4. Gestion des erreurs et valeurs optionnelles
Les données JSON réelles
Aussi dans la bibliothèque
Newtonsoft.Json pour C# (.NET) : guide complet avec exemples
Inversify TypeScript : guide complet avec exemples pratiques
Sérialisation d'objets en TypeScript : Guide complet
Apprentissage automatique en Swift : bibliothèques pour iOS/macOS