Sérialisation d'objets en Swift (iOS/macOS) : Codable, JSON et PropertyList

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

Sérialisation d'objets en Swift (iOS/macOS) : Codable, JSON et PropertyList



La sérialisation est le processus de conversion d'objets de données en un format adapté au stockage ou à la transmission (par exemple, JSON, XML, Property List). Dans l'écosystème Apple (iOS, macOS, watchOS, tvOS), Swift fournit un mécanisme puissant et élégant pour la sérialisation et la désérialisation — le protocole Codable. Dans cet article, nous allons détailler comment utiliser Codable, JSONEncoder, PropertyListEncoder et leurs équivalents pour travailler avec les données.



Qu'est-ce que Codable ?

Codable est un protocole composite qui combine Encodable (pour encoder un objet dans un format externe) et Decodable (pour décoder depuis un format externe vers un objet). Si votre structure ou classe Swift est conforme à Codable, vous obtenez automatiquement la possibilité de la sérialiser et de la désérialiser.



Déclaration de base :

struct User: Codable {    let id: Int    let name: String    let email: String}


Tous les types standard de Swift (String, Int, Double, Bool, Date, Data, URL et même les types optionnels et les tableaux/dictionnaires) sont déjà conformes à Codable.



Encodage en JSON

Pour encoder un objet en JSON, on utilise JSONEncoder. Exemple :

let user = User(id: 1, name: "Иван Петров", email: "ivan@example.com")let encoder = JSONEncoder()encoder.outputFormatting = .prettyPrinted // pour un affichage joli

do { let jsonData = try encoder.encode(user) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("Ошибка кодирования: \\(error)")}


Résultat :

{  "id" : 1,  "name" : "Иван Петров",  "email" : "ivan@example.com"}


Décodage depuis JSON

Pour la conversion inverse, on utilise JSONDecoder :

let jsonString = """{  "id": 2,  "name": "Мария Сидорова",  "email": "maria@example.com"}"""let jsonData = Data(jsonString.utf8)let decoder = JSONDecoder()

do { let decodedUser = try decoder.decode(User.self, from: jsonData) print("Декодирован пользователь: \\(decodedUser.name)")} catch { print("Ошибка декодирования: \\(error)")}


Travailler avec Property List (plist)

Pour la sérialisation au format XML Property List, on utilise PropertyListEncoder et PropertyListDecoder. Cela est utile pour stocker des données dans des fichiers de configuration ou UserDefaults.



// Encodage en plistlet encoder = PropertyListEncoder()encoder.outputFormat = .xml

do { let plistData = try encoder.encode(user) // plistData peut être sauvegardé dans un fichier ou UserDefaults} catch { print("Ошибка кодирования plist: \\(error)")}

// Décodage depuis plistlet decoder = PropertyListDecoder()do { let decodedUser = try decoder.decode(User.self, from: plistData) print(decodedUser)} catch { print("Ошибка декодирования plist: \\(error)")}


Clés personnalisées (CodingKeys)

Parfois, les noms de propriétés en Swift ne correspondent pas aux clés dans le JSON. Pour cela, on utilise 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 }}


Désormais, le JSON avec les clés product_id et product_name sera correctement traité.



Gestion des dates et autres types spéciaux

Par défaut, JSONEncoder et JSONDecoder encodent les dates comme TimeInterval

Recommendations