BLOCCHI INCORPORATI DIZIONARIO (Dictionaries blocks)

I dizionari sono strutture di dati che associano un valore, spesso chiamato chiave (Key), con un altro valore. Un modo comune di visualizzare dizionari è l’utilizzo di JSON. I blocchi dizionari appartengono ad App Inventor 2 e Kodular: Per Thunkable X i concetti sono molto simili e la pagina viene chiamata Componenti Oggetti.

Contenuti:

App Inventor 2 Kodular
Fig.: Le due liste dei componenti

Premessa

JSON (JavaScript Object Notation) https://www.json.org/json-it.html  è un noto formato di scambio di dati utilizzato dalle interfacce API.

JSON consente di raggruppare un vasto numero di dati in un’unica porzione di testo e di inviarli a un altro servizio. Grazie a Json è possibile dialogare tra più linguaggi di programmazione. È adattabile ad ogni tipo di situazione, oltre ad essere dotato di una struttura davvero semplice, in grado di consentire agli sviluppatori di comprendere immediatamente, il significato di ciò che stiamo vedendo. Attraverso le poche righe di codice, infatti, il programmatore può leggere facilmente l’output e di conseguenza può realizzare degli script articolati, che sfruttano i dati provenienti dai Social Network o dai Servizi Web.

Questa sua caratteristica non è per niente una cosa da poco, ed è un qualcosa di fondamentale importanza quando si eseguono lavori su progetti vasti ed impegnativi. JSON, JSV & XML sono i tre formati più utilizzati per la gestione di questi dati.

Introduzione

Un dizionario è una raccolta (collection) non ordinata di oggetti indirizzati tramite chiavi UNIVOCHE (invece che per posizione, come nelle Liste che sono oggetti ordinati legati a degli Indici). Di conseguenza, i dizionari sono più flessibili nell’utilizzo.
Un dizionario in informatica (Computer Science) è una struttura di dati utilizzata per memorizzare coppie chiave-valore in modo molto simile a un dizionario del mondo reale in cui sono memorizzate le parole e le loro definizioni. A differenza del dizionario del mondo reale, la struttura dei dati del dizionario utilizzata in Computer Science può contenere chiavi arbitrarie associate a valori arbitrari. Queste chiavi e valori arbitrari possono essere praticamente qualsiasi cosa: lettere, parole, stringhe di più parole, numeri, nonché combinazioni miste di tutti questi elementi.

Nei linguaggi di programmazione assume diversi nomi: record, oggetto, struct, tabella hash, elenco di chiavi, mappa, array associativo, matrice associativa.

I dizionari (o Oggetto), sono strutture di dati a coppia (pairs) che associano un valore chiave (Key), con un altro valore.

Le coppie oltre a chiave/valore, si chiamano anche nomi/valori o stringhe/valori.

logo Json

Un modo comune di visualizzare dizionari è l’utilizzo di JavaScript Object Notation (JSON  [1]), cioè un file di testo del tipo:

{
  "id":  1,
  "name":  "Tim the Beaver",
  "school": {
  "name": "Massachusetts Institute of Technology"
  },
  "enrolled": true,
  "classes": ["6.001", "18.01", "8.01"]
}

Se lo vogliano leggere sequenzialmente, sarà:

{"id":1,"name":"Tim the Beaver","school":{"name":"Massachusetts Institute of Technology"},"enrolled": true,"classes": ["6.001", "18.01", "8.01"]}

Nel Dizionario contenuto all’interno di {}, vediamo che ci sono cinque Coppie separate da ,:

  1. "id":1,
  2. "name":"Tim the Beaver",
  3. "school":{"name":"Massachusetts Institute of Technology"},
  4. "enrolled": true,
  5. "classes": ["6.001", "18.01", "8.01"]

di cui le Key sono:

  1. "id"
  2. "name"
  3. "school"
  4. "enrolled"
  5. "classes"

e i relativi Valori sono (un’attenzione ai simboli "" : []):

  1. il numero 1
  2. una stringa "Tim the Beaver"
  3. un altro dizionario formato dalla coppia "name":"Massachusetts Institute of Technology"
  4. un valore booleiano true
  5. una Lista (o Array in alcuni linguaggi) ["6.001", "18.01", "8.01"]

Caricare JSON

Per caricare il file bisogna essere in possesso dell’URL ed aver caricato il componente WEB del Gruppo Connettività:

Normalmente per accedere alle API i siti chiedono una registrazione (https://newsapi.org/)  e fanno pagare un abbonamento, ma altri possono essere gratuiti : https://apilist.fun/ ; https://any-api.com/ .

Se il tuo Browser non ha la funzione JSON, per una migliore lettura consiglio il sito https://jsonformatter.org/

Leggi l’articolo completo qui.

Esempio di blocchi

L’esempio precedente mostra che in JSON le Key (testo tra virgolette prima dei due punti ) possono essere associate a diversi tipi di valori. I tipi consentiti sono numeri, testo, altri dizionari, booleani ed elenchi. Nella lingua dei blocchi, puoi costruire questo dizionario come segue: 

Figura 1 : una rappresentazione a blocchi dello snippet di codice JSON mostrato sopra.

Crea un dizionario vuoto – create empty dictionary

Il blocco create empty dictionary crea un dizionario senza coppie chiave-valore. Le voci possono essere aggiunte al dizionario vuoto usando il blocco set value for key. Il blocco create empty dictionary può anche essere trasformato in un blocco make a dictionary utilizzando il pulsante di mutatore blu per aggiungere voci pair (coppia).

Componi un dizionario – make a dictionary

Il make a dictionary viene utilizzato per creare un dizionario con una serie di coppie note in anticipo. Ulteriori voci possono essere aggiunte utilizzando set value for key.

Coppia – pair

Il blocco coppia è un blocco speciale utilizzato per costruire dizionari.

Ottieni valore da chiave – get value for key

Il blocco get value for key verifica se il dizionario contiene un valore corrispondente per la chiave specificata. In tal caso, il valore viene restituito. In caso contrario, il valore del parametro not found (non trovato) viene restituito . Questo comportamento è simile al comportamento del blocco Liste lookup in pairs.

Imposta valore da chiave – set value for key

Il blocco set value for key imposta il valore corrispondente per il dato key nel dictionary a value. Se non esiste alcuna mappatura per key, ne verrà creata una nuova. In caso contrario, il valore esistente viene sostituito dal nuovo valore.

Elimina entrate per chiave – delete entry for key

Il blocco delete entry for key rimuove la combinazione (mappatura) dei valori/chiave nel dizionario per la chiave specificata. Se nel dizionario non esiste alcuna voce per la chiave, il dizionario non viene modificato.

Ottieni valore a percorso di chiave – get value at key path

Il blocco get value at key path è una versione più avanzata del get value for key. Invece di ottenere il valore di una chiave specifica, prende invece un elenco di chiavi e numeri validi che rappresentano un percorso attraverso una struttura di dati. Il blocco get value for key equivale a utilizzare questo blocco con un percorso chiave di lunghezza 1 contenente la chiave. Ad esempio, i seguenti due blocchi restituirebbero “Tim the Beaver“: Questo scorre la struttura dei dati, a partire dal dizionario iniziale, usando il path (percorso) fornito, al fine di recuperare i valori nidificati in profondità nelle strutture di dati complessi. È utilizzato al meglio per l’elaborazione di dati JSON da servizi Web. A partire dall’input iniziale, prende il primo elemento in key path e controlla se in quel punto esiste una chiave (se l’input è un dizionario) o un indice (se l’input è un elenco). In tal caso, seleziona quell’elemento come input e procede a controllare l’elemento successivo in key path , continuando fino a quando non è stato seguito l’intero percorso, a quel punto restituisce ciò che si trova in quella posizione o il parametro not found (non trovato) .

Esempi

{

  "id":  1,

  "name":  "Tim the Beaver",

  "school": { "name": "Massachusetts Institute of Technology"

  },

  "enrolled": true,

  "classes": ["6.001", "18.01", "8.01"]

}

Ad esempio, dato il dizionario JSON sopra, il seguente uso get value at key path produrrà il risultato “Massachusetts Institute of Technology”. Il get value at key path< consente al percorso di includere numeri che rappresentano l’indice degli elementi da attraversare quando i dizionari e gli elenchi vengono mescolati. Ad esempio, se volessimo conoscere la seconda classe che stava prendendo Tim, potremmo fare quanto segue: che restituisce il valore “18.01”.

Imposta valore a percorso di chiave – set value for key path

Il blocco set value for key path aggiorna il valore a uno specifico key path in una struttura di dati. È accoppiato al get value at key path, che recupera un valore in uno specifico key path . Il percorso deve essere valido , ad eccezione dell’ultima chiave, che se non esiste un mapping creerà un mapping al nuovo valore. In caso contrario, il valore esistente viene sostituito con il nuovo valore.

Ottieni chiavi – get keys

Il get keys restituisce un elenco di chiavi nel dizionario.

Ottieni valori – get values

Il get values restituisce una lista contenente i valori nel dizionario. La modifica del contenuto di un valore nell’elenco lo modificherà anche nel dizionario.

La chiave è nel dizionario? – is key in dictionary?

Il is key in dictionary? testa se esiste la chiave nel dizionario e ritorna true se lo fa, altrimenti restituisce false.

Dimensione del dizionario – size of dictionary

Il blocco size of dictionary restituisce il numero di coppie chiave-valore presenti nel dizionario.

Lista di coppie a dizionario – list of pairs to dictionary

Il blocco list of pairs to dictionary converte un elenco associativo del modulo ((key1 value1) (key2 value2) ...) in un dizionario che associa le chiavi ai loro valori. Poiché i dizionari offrono prestazioni di ricerca migliori rispetto alle Liste, se si desidera eseguire molte operazioni su una struttura di dati, è consigliabile utilizzare questo blocco per convertire prima la Lista in un Dizionario.

Dizionario a lista di coppie – dictionary to list of pairs

Il dictionary to list of pairs converte un dizionario in una Lista. Questo blocco inverte la conversione eseguita dal blocco list of pairs to dictionary. Esempio di come il dizionario per elencare il blocco di coppie inverte l’elenco di coppie nel blocco di dizionario

Copia dizionario – copy dictionary

Il copy dictionary fa una copia profonda del dizionario dato. Ciò significa che tutti i valori vengono copiati in modo ricorsivo e che la modifica di un valore nella copia non lo modificherà nell’originale.

Unisci nel dizionario – merge into dictionary

Il blocco merge into dictionary from dictionary copia le coppie chiave-valore da un dizionario a un altro, sovrascrivendo qualsiasi chiave nel dizionario di destinazione.

List by walking key path

Il list by walking key path funziona in modo simile al get value at key path, ma crea un elenco di valori anziché restituire un singolo valore. Funziona partendo dal dizionario dato e “cammina” (walking) lungo l’albero degli oggetti seguendo il percorso indicato. A differenza del get value at key path però, il suo percorso può essere composto da tre tipi principali: chiavi del dizionario, indici di elenco e il blocco walk all at level. Se viene fornita una chiave o un indice, il percorso specifico viene preso in quel punto dell’albero. Se walk all at level viene specificato, ogni valore in quel punto viene seguito in successione (larghezza prima), a quel punto la camminata continua dall’elemento successivo nel percorso. Qualsiasi elemento che corrisponde all’intero percorso viene aggiunto all’elenco di output.

Esempi. Considera i seguenti JSON e blocchi:

{
  "people": [{

    "first_name": "Tim",
    "last_name": "Beaver"
  },{
    "first_name": "John",
    "last_name": "Smith",
  },{
    "first_name": "Jane",
    "last_name": "Doe"
}]
} Se global data contiene un dizionario rappresentato da JSON, il list by walking key path produrrà l’elenco [“Tim”, “Beaver”]. Innanzitutto, il tag del valore “people” , che è l’elenco delle persone, viene scelto. Successivamente, viene scelto il primo elemento nell’elenco. Infine, il blocco walk all at level seleziona i valori nell’oggetto in quel punto, cioè i valori “Tim”e “Beaver”.

È inoltre possibile utilizzare walk all at level a un livello contenente un elenco. Ad esempio, il blocco seguente seleziona i nomi (first name = nomi propri n.d.r.) di tutte le persone nella struttura, ad es [“Tim”, “John”, “Jane”]. Questo blocco può essere utilizzato anche con XML parsed (= analizzatore di XML. Tutti i principali browser hanno un analizzatore XML integrato per accedere e manipolare XML) utilizzando il blocco Web.XMLTextDecodeAsDictionary .

Considera il seguente documento XML:

<schedule>
   <day>
      <room name="Hewlitt" />
      <room name="Bleil" />
   </day>
   <day>
      <room name="Kiva" />
      <room name="Star" />
   </day>
</schedule>

È possibile utilizzare i seguenti blocchi per ottenere un elenco dei nomi delle stanze il primo giorno, ad es [“Hewlitt”, “Bleil”].

Walk all at level

Il walk all at level è un blocco specializzato che può essere utilizzato nel percorso chiave di a list by walking key path. Quando viene incontrato durante un percorso (path), viene esplorato ogni oggetto a quel livello. Per i dizionari, ciò significa che viene visitato ogni valore. Per le Liste, ogni elemento nell’elenco viene visitato. Questo può essere usato per aggregare informazioni da un elenco di elementi in un dizionario, come il nome di ogni persona in un database rappresentato da oggetti JSON. Vedi il blocco list by walking key path  per esempi.

E’ un dizionario? – is a dictionary?

Il blocco is a dictionary? verifica se la “cosa” data (valore/oggetto) è un dizionario o meno. Restituirà true se il valore/oggetto è un dizionario e in caso false contrario. https://community.appinventor.mit.edu/t/one-way-to-store-daily-appointments-in-a-dictionary-structure/9723  

[1] Un interessante articolo sui dati JSON si trova qui http://ai2.appinventor.mit.edu/reference/other/json-web-apis.html .

Aggiornato al 09/11/2021
Aggiornato al 09/11/2021
   

PDF Lista comparazione dei componenti di AI2 KODULAR THUNKABLEX agg.20210911

Vuoi avere più informazioni sul Coding visuale? Vai alla pagina dei Blocchi incorporati dove potrai imparare a scrivere il linguaggio di programmazione per App Inventor 2, Kodular e Thunkable X. Visita la pagina del Blog con le ultime notizie sulle le tre piattaforme. Nella pagina Documentazione troverai i collegamenti ai forum, il glossario, i link ai siti dei migliori programmatori, i download e tanti altri accessori.