Freddy: open-source json parser in swift

Introduction à Freddy : une nouvelle bibliothèque pour parser du JSON en Swift

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.

1 Etoile2 Etoiles3 Etoiles4 Etoiles5 Etoiles (3 votes, average: 5,00 out of 5)
Loading...

Aucun commentaire

Time limit is exhausted. Please reload CAPTCHA.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.