La dernière fois nous avons vu comment parser du JSON en utilisant la librairie standard d’Apple ainsi que SwiftyJSON. Aujourd’hui nous allons vous présenter une toute nouvelle bibliothèque qui parait prometteuse pour parser JSON en Swift : Freddy.
Pourquoi nous vous parlons de Freddy aujourd’hui ? Tout simplement parce que contrairement à SwiftyJSON, Freddy incorpore son propre parser JSON afin d’améliorer les performances sur des gros fichiers JSONs. De plus sa conception est très propre et respecte en grande partie les bonnes pratiques et conventions de codage de Swift. De plus sa manipulation est simple et puissante. C’est pour tout cela que nous avons décider de vous présenter cette nouvelle bibliothèque.
Freddy en action
Avant de commencer nous allons utiliser le même example que la dernière fois (http://api.randomuser.me) :
{
"results": [
{
"user": {
"gender": "male",
"name": {
"title": "mr",
"first": "nathaniel",
"last": "stone"
},
"location": {
"street": "4618 tara street",
"city": "Tramore",
"state": "ohio",
"zip": 90878
},
"email": "nathaniel.stone@example.com",
"username": "brownbird525",
"password": "pedro",
"salt": "6BZEg7xW",
"md5": "0a2ee933729c08b3a406c8a3f96c04ff",
"sha1": "15990fe023b3764d372d6875d93032b1bf72c450",
"sha256": "847c9f3d2a30b841e2c542f6e8e4b07cf90349ec81810abe271fe816da16a1a2",
"registered": 1073878993,
"dob": 969304726,
"phone": "051-554-0806",
"cell": "081-296-4995",
"PPS": "7053419T",
"picture": {
"large": "https://randomuser.me/api/portraits/men/10.jpg",
"medium": "https://randomuser.me/api/portraits/med/men/10.jpg",
"thumbnail": "https://randomuser.me/api/portraits/thumb/men/10.jpg"
}
}
}
],
"nationality": "IE",
"seed": "b8b578a28fa0a98505",
"version": "0.7"
}
Le JSON retourné est objet avec 4 propriétés :
- results : la liste des personnes générés. Chaque personne est un objet.
- nationality : le code ISO 3166 du pays représentant la nationalité des personnes de la liste.
- seed : un identifiant unique.
- version : la version de l’API.
Decodage du JSON
Ici nous nous intéressons aux utilisateurs retournés. Nous créons donc un objet User
avec les propriétés qui nous intéressent :
struct User {
let firstname: String
let lastname: String
let gender: String
}
La question venant après c’est comment je décode mon JSON
dans une instance de User
? Freddy fournit le protocole JSONDecodable
:
public protocool JSONDecodable {
init(json: JSON) throws
}
JSONDecodable
exige l’implémentation d’un initialiser qui prend en paramètre une instance de JSON
à tous ceux qui s’y conforment. Donc nous conformons User
à ce protocole :
extension User: JSONDecodable {
init(json: JSON) throws {
firstname = try json.string("name", "first")
lastname = try json.string("name", "last")
gender = try json.string("gender")
}
}
Comme le parsing du JSON
peut soulever des exceptions, nous devons utiliser le mot clé try
pour trouver les valeurs associées aux différentes clés. Une facilité de Freddy est de permettre l’utilisation d’un chemin au lieu d’une clé simple. Par example pour firstname
et lastname
comme la structure du JSON
est imbriquée, nous pouvons accéder à leur valeur en utilisant les clés « name » puis « first » ou « last ». Si il erreur survient car la clé n’existe pas, ou quoique ce soit d’autre l’erreur est propager à l’appelant.
Création de l’objet JSON
Nous savons déjà comment passer un JSON
aux User
. Nous allons maintenant voir comment nous créons une instance d’un JSON
:
let data: NSData = getSomeData() // Par avec un web-service
do {
let json = try JSON(data: data)
let results = try json.array("results")
let userJSON = results.flatMap { $0["user"] }
let users = try userJSON.map(User.init)
}
catch {
// Gérer les erreurs ici
}
Tout d’abord, nous appelons json.array(_:)
avec la clé results pour récupérer un Array<JSON>
. Ensuite, pour chacune des valeurs contenue dans la liste on récupère l’objet de la clé user. Pour ce faire nous appelons la méthode flatMap(_:)
de l’objet results et l’on transforme le résultat en JSON
. Pour finir on transforme chacun de ces JSON
en User
en appellant la méthode init(json:)
du protocol JSONDecodable
.
Conclusion
Freddy n’est pas un parser JSON
comme les autres dans le sens où il a été conçu pour être plus performant que la version native et respectant au mieux la philosophie Swift. Pour en savoir un peu plus sur Freddy nous vous conseillons d’allez voir la documentation. Cela vous aidera à approfondir le sujet et à comprendre les concepts adjacents.