Image d'illustration pour comment parser du JSON en Swift

Comment parser du JSON en Swift

De nos jours le format JSON (JavaScript Object Notation) est très répandu et on le rencontre souvent lorsque l’on veut communiquer avec différents services distants au travers d’API REST. C’est pourquoi il est important de savoir travailler efficacement avec. Ce tutoriel va vous présenter la méthode native avec NSJSONSerialization et la bibliothèque la plus répandu SwiftyJSON.

Le contexte

Avant de commencer partons d’un cas concret afin de contextualiser cet article. Nous allons pour cela utiliser une API public et gratuite que nous pouvons utiliser dans nos application : Random User Generator API. C’est une API très utile pour générer des « fausses » personnes avec leur nom, prénom, age, photo, etc. C’est très pratique pour remplir une liste de personne avec des données plus pertinentes qu’un simple lorem ipsum.

Regardons le format retourner par cette API (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.

Ensuite chaque personne a un ensemble d’attribut parmi lesquelles on trouve son nom, son sexe, son adresse, son email, sa photo et encore d’autres choses.

Pour simplifié ce tutoriel nous allons nous concentré uniquement sur l’affichage du prénom de la première personne. Toujours dans un soucis de clarté et de simplicité nous allons mettre le JSON dans une chaine de caractère qu’on va ensuite transformé en NSData pour faciliter sa manipulation ultérieure :

let js   = "{\"results\": [{\"user\": {\"name\": {\"first\": \"nathaniel\"}}}]}"
let data = js.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!

Maintenant que l’on a notre base de travail regardons comment parser ce JSON en Swift en utilisant les bibliothèque standard d’iOS et OSX.

Version Native

Avec iOS, OSX, TvOS et WatchOS, Apple fourni une bibliothèque standard pour parser du JSON qui s’appelleNSJSONSerialization. Voyons comment cela fonctionne pour afficher le prénom de la première personne :

do {
  let json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments)

  if let results = json["results"] as? [AnyObject],
     let user = results[0]["user"] as? [String: AnyObject],
     let name = user["name"] as? [String: AnyObject],
     let firstname = name["first"] as? String {
    print(firstname) // nathaniel
  }
}
catch {
  print("Erreur avec le JSON : \(error)")
}

Comme vous pouvez vous en rendre compte c’est un peu fastidieux. Nous devons tout d’abord parser le JSON avec la possibilité qu’une exception survienne. C’est pour cela que notre code est entouré de la structure do-catch, afin de capturé toute erreur éventuellement lié au parsing du JSON.

Ensuite nous regardons pour chaque niveau du json si la clé existe et qu’elle est bien du bon type. Tout d’abord nous regardons que results est bien une liste, puis qu’il contient un élément avec l’objet user qui contient lui même l’objet name pour enfin vérifier qu’il possède l’attribut first qui est une chaine de caractère.

Bien sûr il y a d’autre façon de présenter le parsing, mais cela reste quelque chose d’assez fastidieux. Regardons maintenant du coté de SwiftyJSON.

Version SwiftyJSON

SwiftyJSON est une librairie open-source qui permet de manipuler les JSONs d’une manière beaucoup plus élégante. Pour l’installer je vous conseille d’utiliser Cocoapods et de taper « pod try SwiftyJSON » pour le tester.

Reprenons le cas précédent et voyons comment écrire la même chose avec cette bibliothèque :

import SwiftyJSON

let json = JSON(data: data)

if let firstname = json["results"][0]["user"]["name"]["first"].string {
  print(firstname) // nathaniel
}
else {
  print("Il n'y a pas de personne disponible")
}

Comme vous pouvez le remarquer le code est beaucoup plus concis. Pour commencer il n’y a plus besoin de gérer les erreurs, ensuite vous pouvez chainer les appels très simplement et pour finir vous avez à vérifier le type de la variable qu’une seule fois.

Ceci n’est qu’un petit example, si vous voulez en savoir plus sur SwiftyJSON je vous conseille de regarder son README. Si vous souhaitez un tutoriel spécifique sur ce sujet n’hésitez pas à le demander dans les commentaires.

Conclusion

Il y a tous les outils nécessaires en swift pour travailler avec les JSONs mais ils sont un peu fastidieux à l’utilisation. Pour cela des librairies open-sources ont vu le jour comme SwiftyJSON et qui donne une vraie flexibilité. En revanche, et comme la plupart du temps, si vous avez des problèmes de performance il vaut mieux rester sur du natif car les librairies comme SwiftyJSON rajoute des vérifications qui demande plus de resources.

Nous espérons que cet article vous aura plu, n’hésiter à laisser des commentaires si vous avez des questions.

1 Etoile2 Etoiles3 Etoiles4 Etoiles5 Etoiles (2 votes, average: 3,00 out of 5)
Loading...
Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPin on PinterestShare on RedditDigg this

2 commentaires

Time limit is exhausted. Please reload CAPTCHA.

  1. Mathieu · 1 février 2016

    Bonjour ! Cela fait quelques jours que j’essaye de parser ce json directement via l’url: http://api.randomuser.me/
    Sans succès malheureusement… Je n’arrive pas à accéder aux valeurs…
    Est-ce que c’est réellement possible ?

    • yannickl · 1 février 2016

      Que veux tu dire par « essayer de parser le JSON directement » ?

      En utilisant l’url pour récupérer une réponse en JSON puis en la parsant directement ?