L'integrazione con il resto del mondo è uno dei principali punti di forza di FileMaker.

XML, ODBC, PHP e via discorrendo sono già da tempo sfruttati al massimo dagli sviluppatori, anche con particolare maestria, in alcuni casi limite.

In questo articolo ci concentriamo sul JSON, dato che FileMaker 16 finalmente ha reso disponibili delle funzioni predefinite per semplificare il parsing e la creazione dei dati ricavati da questo tipo di file.

Cos’è il  JSON?

JSON è l’acronimo di for JavaScript Object Notation e nasce da un subset del linguaggio JavaScript.

Si tratta di un linguaggio standard (come da specifica RFC4627 on IETF - International Engineering Task Force), le cui specifiche sono state redatte da Doglus Crockford nel luglio 2006.

JSON è un formato di testo leggero per scambio dati; nasce come formato per la gestione e lo scambio di dati da e verso webserver o webservices; è independente dal linguaggio utilizzato e può quindi essere impiegato da qualsiasi linguaggio di programmazione.

JSON è inoltre “human readable”, ovvero ha una sintassi molto semplice e può essere compreso a colpo d'occhio.

Il tipo di file per il JSON è “.json"; il MIME type per JSON è "application/json".

La sintassi del JSON

In JSON i dati possono essere di 4 tipi: testo, numero, null o booleani.

I dati vengono scritti con una sintassi del tipo: nome:valore; i nomi  (o i valori di tipo testo) vanno messi tra virgolette (").

I dati sono separati da virgole, e vanno racchiusi in un elemento root costituito da due parentesi graffe. Ad esempio il costrutto:

{ "name":"John", "age":30, "car":null }

identifica un record con tre tipi di dati: nome, età e auto.

Oltre ai 4 tipi di dato abbiamo 2 tipi di strutture che sono gli oggetti e gli arrays.

Gli oggetti sono racchiusi in parentesi graffe {} e sono liste di "nome": "valore", separati da virgole.

Gli arrays sono racchiusi in parentesi quadre [], rappresentati come liste di valori, separati da virgole.

Esempio

[

"Ford", "BMW", "Fiat"

]

Sia negli oggetti che negli arrays i valori possono essere altri oggetti o altri arrays.

Esempio

{

"name":"John",

"age":30,

"cars": {

"car1":"Ford",

"car2":"BMW",

"car3":"Fiat"

}

}

È possibile “accedere” ai valori presenti nel JSON specificando il nome dell’elemento, oppure l’indice dell’array o una combinazione di entrambi.

L'esempio riportato sopra può facilmente essere reso in FileMaker come una scheda contenente un portale con le autovetture possedute da John.

Le funzioni JSON di FileMaker 16

Fino a ieri ci siamo dovuti arrangiare per gestire il testo in JSON che viene restituito dai web services, con problemi di varia natura.

In linea di massima la strada consigliata era l'utilizzo di plug-in che ci agevolassero il lavoro.

Il JSON di per sè non è molto FileMaker-friendly: la sua leggerezza e duttilità lo rendono adatto allo scambio dati tra siti, alla processazione da parte degli interpreti JavaScript (da cui originalmente discende), ma ostico alla processazione in FileMaker, che digerisce meglio il più strutturato ed esplicito XML

Da oggi cambia tutto.

FileMaker Pro 16 include infatti una serie di funzioni che che consentono di modificare e ricavare dati da testo in JSON e ci possiamo finalmente togliere il gusto di affermare che “quando il gioco si fa duro i duri iniziano a giocare”!

Ecco i nostri nuovi strumenti per affrontare a testa alta il mondo del JSON, partendo da una piccola chicca aggiunta alla funzione InserisciDaURL: mentre prima la funzione interagiva solo con dei campi (testo o contenitore) dalla versione 16 è possibile impostare con tale funzione anche una semplice variabile: InserisciDaURL (URL  ; $variabile).

Formattazione del JSON

JSONFormatElements 

Sintassi: JSONFormatElements ( CodiceJSON )

La funzione JSONFormatElements ha il solo scopo di rendere leggibile il testo in JSON

Non viene eseguita nessuna trasformazione (se non il fatto che la formattazione del testo viene persa), con un piccolo distinguo: la funzione conserva l'ordine all'interno degli array ma non quello degli oggetti.

Il nostro esempio originale

{"name":"John", "age":30, "car":null , "flag":true}

diventa

{

"age" : 30,

"car" : null,

"flag" : true,

"name" : "John"

}

Parsing del JSON

JSONGetElement

Sintassi: JSONGetElement ( CodiceJSON ; keyOrIndexOrPath )

La funzione JSONGetElement serve a ricavare un elemento del JSON, specificando una chiave, un indice o un path, tenendo presente che entriamo in territorio esoterico:

La chiave è il nome del dato.

L'indice è il numero dell'elemento in un array.

Il path è l'insieme gerarchico di chiavi e indici.

Ecco un breve schema della sintassi supportata dalla funzione:

chiave / indice o parametro di percorso  descrizione
"." (opzionale) Il livello base, se è il primo carattere
".[n]" Numero specifico di elemento in un array al livello base
".name" La chiave di un nome oggetto al livello base
".nameA.nameB.nameC" Un oggetto chiamato C, che discende da un oggetto chiamato B e da un oggetto chiamato A
".[3][2][1]nameA[0]" Il primo elemento dell'array nell'oggetto nameA, che è al terzo livello di un set di array annidati

Ad esempio, se abbiamo un JSON del tipo:

{"name":"John", "age":30, "car":null , "flag":true}

JSONGetElement (CodiceJSON ;  “age” )

restituisce

30

Nel caso invece di  un JSON tipo array come

 

[

"Ford", "BMW", "Fiat"

]

JSONGetElement (CodiceJSON ;  1 )

restituisce

BMW

Infine, in un costrutto completo come:

{"name":"John",

"age":30,

"bike":null,

"cars":{

"car1":"Ford",

"car2":"BMW",

"car3":"Fiat",

"car4":"Mercedes"}}

JSONGetElement (CodiceJSON ;  “cars.car1”)

restituisce

Ford

JSONListKeys

Sintassi: JSONListKeys ( CodiceJSON ; keyOrIndexOrPath )

La funzione JSONListKeys ritorna le chiavi del testo (i nomi dei valori)  JSON, eliminando i valori e le virgolette; Impiegata in maniera "diretta" sul JSON ha poco scopo, viene utilizzata al meglio negli script per descrivere il JSON ed isolarne la porzione che ci interessa.

JSONListValues

Sintassi: JSONListValues ( CodiceJSON ; keyOrIndexOrPath )

La funzione JSONListValues ritorna i valori del testo JSON, rimuovendo i nomi e le virgolette dal testo. Impiegata in maniera "diretta" sul JSON ha poco scopo, viene utilizzata al meglio una volta isolata la porzione di JSON che ci interessa

Modificare ed aggiungere elementi al JSON

È possibile modificare un testo in JSON modificando o aggiungendo valori.

JSONSetElement

Sintassi: JSONSetElement ( CodiceJSON ; keyOrIndexOrPath ; value; type )

La funzione JSONSetElement serve a modificare un elemento del JSON, specificando una chiave, un indice o un path. Il tipo di dato va specificato, oppure va indicato che si tratta di dato "raw", lasciando quindi che il parser del JSON si occupi di interpretarlo.

Tipo Valore relativo
JSONString Stringa (" ")
JSONNumber Numero
JSONObject Oggetto ( { } )
JSONArray Array ( [ ] )
JSONBoolean Booleano
JSONNull Null
JSONRaw Dipende dal parser JSON

Se il dato che viene "puntato" è già presente, il dato viene modificato.

Esempio

{"name":"John", "age":30, "car":null , "flag":true}

JSONSetElement (codiceJSON ; “age” ; 88; number)

ritorna

{"name":"John", "age”:88, "car":null , "flag":true}

In caso contrario viene aggiunto.

Esempio

{"name":"John", "age":30, "car":null , "flag":true}

JSONSetElement (codiceJSON ; “hair” ; “brown”; string)

ritorna

{"age":30,"car":null,"flag":true,"hair":"brown","name":"John"}

Appare subito chiaro che si tratta di una funzione molto potente che permette di gestire qualunque tipo di dati all'interno del file JSON.

Le stesse regole viste nella funzione JSONGetElement valgono per indicare quale dato va modificato o aggiunto, sempre seguendo la regola che se il dato esiste già viene modificato, altrimenti aggiunto:

Nel caso:

{

"name":"John",

"age":30,

"bike":null,

"cars":{

"car1":"Ford",

"car2":"BMW",

"car3":"Fiat",

"car4":"Mercedes"}}

JSONSetElement (codiceJSON ; “cars.car4” ; “Mazda”; “string”)

restituisce

{

"age" : 30,

"bike" : null,

"cars" :

{

"car1" : "Ford",

"car2" : "BMW",

"car3" : "Fiat",

"car4" : "Mazda"

},

"name" : "John"

}

Analogamente, partendo da

{

"name":"John",

"age":30,

"bike":null,

"cars":{

"car1":"Ford",

"car2":"BMW",

"car3":"Fiat",

"car4":"Mercedes"}}

JSONSetElement (codiceJSON ; “cars.car5” ; “Toyota”; “string”)

restituisce

{

"age" : 30,

"bike" : null,

"cars" :

{

"car1" : "Ford",

"car2" : "BMW",

"car3" : "Fiat",

"car4" : "Mercedes",

"car5" : "Toyota"

},

"name" : "John"

}

Anche negli array valgono stesse regole viste nella funzione JSONGetElement valgono per indicare quale dato va modificato o aggiunto, sempre seguendo la regola che se il dato esiste già viene modificato, altrimenti aggiunto

Nel caso di

[

"Ford", "BMW", "Fiat"

]

JSONSetElement (codiceJSON ; 1 ; “Toyota”; “string”)

restituisce

[

"Ford","Toyota","Fiat"

]

mentre JSONSetElement (codiceJSON ; 3 ; “Toyota”; “string”)

restituisce

[

"Ford","BMW","Fiat","Toyota"

]

Eliminare elementi al JSON

È possibile eliminare elementi del JSON.

JSONDeleteElement

Sintassi: JSONDeleteElement ( CodiceJSON ; keyOrIndexOrPath )

La funzione JSONDeleteElement serve ad eliminare un elemento del JSON, specificando una chiave, un indice o un path partendo da:

{"name":"John", "age":30, "car":null , "flag":true}

JSONDeleteElement (codiceJSON ; “age”)

restituisce

{

"car" : null,

"flag" : true,

"name" : "John"

}

Oppure nel caso di:

[

"Ford", "BMW", "Fiat"

]

JSONSetElement (codiceJSON ; 1)

ritorna

[

"Ford","Fiat"

]

Nella funzione JSONDeleteElement valgono le stesse regole della funzione JSONGetElement per indicare l'elemento da eliminare

Ad esempio, avendo:

{

"age" : 30,

"cars" :

[

{

"models" : [ "Fiesta", "Focus", "Mustang" ],

"name" : "Ford"

},

{

"models" : [ "320", "X3", "X5" ],

"name" : "BMW"

},

{

"models" : [ "500", "Panda" ],

"name" : "Fiat"

}

],

"name" : "John"

}

JSONDeleteElement (codiceJSON ; “cars[0].models[1]”)

restituisce

{

"age" : 30,

"cars" :

[

{

"models" : [ "Fiesta", "Mustang" ],

"name" : "Ford"

},

{

"models" : [ "320", "X3", "X5" ],

"name" : "BMW"

},

{

"models" : [ "500", "Panda" ],

"name" : "Fiat"

}

],

"name" : "John"

}

Errori nella gestione del JSON

Se un file JSON non è scritto in maniera corretta le funzioni di cui sopra riportano un errore: il testo dell’errore inizia con un “?” ed è seguito dalle specifiche dell’errore.

Esempio

? * Line 3, Column 2

Missing ':' after object member name

* Line 13, Column 5

Extra non-whitespace after JSON value.

Si può usare la funzione JSONFormatElements per validare il JSON prima di processarlo: se infatti si applica la funzione ad un testo ed il JSON non è scritto correttamente viene ritornato un errore, ed il primo carattere del testo di errore è sempre "?".

È quindi possibile verificare la correttezza del JSON con la funzione

Sinistra (JSONFormatElements ( CodiceJSON ) ; 1 ) = "?"

come nel caso in esempio, in cui è stata aggiunta una virgola dopo l'ultima parentesi graffa.

Conclusione

È ovvio che qui siamo in un ambiente totalmente diverso rispetto a FileMaker, che va esplorato a fondo, ma per facilitarvi l'approccio iniziale abbiamo creato un file di esempio che puoi ricevere direttamente nella tua email semplicemente compilando il form qui sotto.

LASCIA UN COMMENTO

Please enter your comment!
Please enter your name here