JSON e LSL (3 di 4)

Ora che abbiamo visto, nella parte precedente come maneggiare gli array JSON passiamo ad osservare quelli che vengono chiamati JSON Object, di fatto non sono altro che normali array ma che a differenza di quanto visto sino ad ora i valori non sono indicizzati con un numero, ma con una stringa!

…facciamo un esempio:


[0] Asdrubale
[1] 158
[2] 200
[3] 23


[Nome] Asdrubale
[Età] 158
[Balance] 200
[Altitudine] 23


Le due serie incolonnate di valori contengono le stesse informazioni, quale delle due vi è stata più chiara alla prima occhiata? Bene, la seconda colonna è un array con stringhe al posto dei numeri (in gergo si chiamano array associativi) e facilita non di poco il lavoro dello scripter. La differenza sostanziale è tutta qui (c’è anche qualche cambiamento nella sintassi), ma i vantaggi in termini di leggibilità è enorme, in fase di scrittura, editing, debug, aggiornamenti, riciclo codice spesso rappresenta una scelta salvifica.

JSON OBJECT

La sintassi di un JSON Object differisce fondamentalmente in tre punti rispetto ad un JSON Array:
1) L’array viene iniziato e terminato utilizzando le parentesi graffe ( { … } ) e non le quadre ( […] ).
2) Ogni valore deve prima essere preceduto dal nome dell’indice, tra virgolette ( \” ), sempre a causa del fatto che un JSON in LSL è memorizzato come una stringa
3) L’etichetta e il valore sono associati tra loro tramite il segno dei due punti ( : ).
Ad es:

string oggettoJson_1 = "{ \"nome\":\"Adalberto\", \"età\":12, \"posizione\":\"<123, 250, 23>\"}";

Mi rendo conto che una simile sintassi pregiudica un poco la leggibilità e ci espone al rischio di errori di scrittura per distrazione, ma questo è come LSL funziona.
E’ bene inoltre ricordarsi che ogni indice associativo deve essere unico in quanto deve essere possibile a LSL di identificarlo in maniera univoca. Non possiamo cioè avere due etichette chiamate entrambe “nome”, se lo facessimo la prima verrebbe ignorata e solo l’ultima verrebbe presa in considerazione.

 


LEGGERE un valore nei JSON OBJECT

Per accedere ad un valore di un JSON Object dovremo specificare non più il numero dell’indice (in quando non esiste) ma invece dovremo indicare l’etichetta a cui corrisponde il valore che ci interessa, qualcosa del tipo:

... = (cast)llJsonGetValue(oggettoJson_1, ["età"]);
//restituisce 12

 


MODIFICARE un valore nei JSON OBJECT

//Prima : nome: "Adalberto", età:12, posizione:<123, 250, 23>
oggettoJson = llJsonSetValue(oggettoJson_1, ["età"],26);
//Dopo : nome: "Adalberto", età:26, posizione:<123, 250, 23>

 


AGGIUNGERE un valore nei JSON OBJECT

Mentre nei JSON Array si era costretti ad utilizzare la costante JSON_APPEND in questo caso sarà sufficiente indicare la nuova accoppiata etichetta e valore corrispondente:

//Prima : nome: "Adalberto", età:26, posizione:<123, 250, 23>
oggettoJson_1 = llJsonSetValue(oggettoJson_1, ["balance"],122);
//Dopo : nome: "Adalberto", età:26, posizione:<123, 250, 23>, balance:122 

 


CANCELLARE un valore nei JSON OBJECT

Si  procede nello stesso modo visto per gli array, l’unica differenza è che la posto dell’indice numerico dovremo mettere l’etichetta del valore da cancellare.

//prima: nome: "Adalberto", età:26, posizione:<123, 250, 23>, balance:122 
mio_array_test1 = llJsonSetValue(oggettoJson_1, ["posizione"], JSON_DELETE );
//dopo: nome: "Adalberto", età:26, balance:122

 


Naturalmente nulla ci vieta, se lo riteniamo comodo, utilizzare il valore di una variabile String al posto dello scrivere il nome dell’etichetta in modo esplicito:

string parametro_da_leggere = "età";
... = (cast) llJsonGetValue(oggettoJson_1, [parametro_da_leggere]);
// restituisce il valore dell'etichetta indicata nella variabile stringa,
// dato che questo è "età", ci verrà restituito l'ultimo valore di esso, cioè 26

Per il resto è tutto identico a quanto detto per i JSON Array, con la necessaria puntualizzazione che è possibile nidificare JSON Object e JSON Array tra loro senza problemi in qualsiasi combinazione.
(Un JSON Object può contenere al suo interno JSON Object e JSON Array.
Un JSON Array può contenere al suo interno JSON Array e JSON Object.)

Nella prossima e ultima parte esamineremo alcuni aspetti di contorno derivanti dall’uso di JSON, per arrivare ad avere un quadro complessivo quanto più possibile di questa non nuovissima ma spesso non molto sfruttata feature di LSL.

Posted in LSL and tagged , , , , , , , .

Leave a Reply

Your email address will not be published.