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
Aussi dans la bibliothèque
Frameworks CLI pour Java : Picocli, JCommander et Spring Shell
Autorisation et authentification en C# (.NET) : Guide complet
Client HTTP pour Swift (iOS/macOS) : top des bibliothèques pour travailler avec le réseau
Journalisation pour C++ : meilleures solutions (spdlog, glog, P7)
Journalisation pour TypeScript : la bibliothèque Winston
Recommendations