Traitement JSON en Swift : Codable, JSONSerialization et exemples pratiques

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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

Recommendations