Skip to main content

Gestire JSON con un Model Value in Swift

512_boxSe stai sviluppando un app per iOS c’è una buona probabilità che tu stia ricevendo dei dati da un webservice remoto in formato JSON.

A volte il JSON viene passato direttamente al ViewController che lo utilizza per popolare l’interfaccia o per effettuare altre operazioni. Questo è sbagliato perché crea del codice più complesso o più insicuro.

Infatti siccome un JSON è tipicamente rappresentato con un Dictionary (o il corrispondente type se stai usando una libreria esterna), il compilatore non può garantire che un determinato campo del JSON:

  1. esista
  2. sia popolato
  3. contenga un valore del tipo corretto

Questo significa che devi ripetere manualmente questi controlli ogni volta che utilizzi un JSON (codice più complesso) e se non lo fai l’app corri il rischio di avere un crash nel momento in cui il JSON ricevuto non sia corretto (codice più insicuro).

Un esempio concreto

Immaginiamo un JSON contenente una lista di blocchi dove ogni elemento rappresenta uno show televisivo.

512_retro-tv

Uno show deve contenere i seguenti campi

  • name: String
  • firstEpisodeAired: String
  • seasons: Int
  • genres: Array di String
  • web: Url (opzionale)

Ecco un esempio di JSON: notate che il terzo elemento, ovvero Battlestar Galacticanon è valido perché il campo season contiene una stringa invece di un intero.

Model Value

Creiamo ora una struct che rappresenta uno show

Abbiamo aggiunto 5 properties (dichiarate come costanti). La property web inoltre è stata dichiarata Optional in quanto il valore potrebbe non essere presente nel JSON.

Inoltre abbiamo definito un failable initializer che riceve un valore di tipo JSON e, nel caso in cui tutti i dati siano presenti e validi, crea un valore di tipo Show.

Un Model Value così definito ci garantisce che se esiste un valore di tipo Show, allora questo è valido.

Per quanto riguarda il tipo JSON è definito nella libreria opensource SwiftyJSON che ti consiglio di scaricare e iniziare a usare da subito nei tuoi progetti in quanto rappresenta (secondo me) la migliore libreria Swift per la gestione dei JSON.

Utilizzo

Per semplicità ho salvato in Playground un file Data.json contenente il JSON visto in precedenza. Vediamo come leggerlo.

Il costrutto guard si occupa di estrarre un valore di tipo NSData dal file locale.

Successivamente la libreria SwiftyJSON permette di trasformare NSData in un valore di tipo JSON.

Infine nell’ultima istruzione viene estratto un array e ogni elemento dell’array (una porzione del JSON) viene passata al costruttore di Show che tenta di inizializzare un valore di tipo Show.

Il risultato è un array di Show, facciamo una prova.

Il valore shows (tipo [Show]) contiene 2 elementi. Infatti il terzo blocco del JSON è stato scartato perché il campo seasons era popolato con la stringa "NOT A NUMBER". Analogamente sarebbe stato scartato qualsiasi blocco che non produceva un valore Show valido.

A questo punto possiamo trasferire shows ad altri livelli dell’applicazione (come il controller) e utilizzarlo in modo sicuro.

Trainer • Developer • Writer

Luca Angeletti

Trainer • Developer • Writer

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *