Ci sono alcune situazione dove lavorando con oggetti JSON si ottengono comportamenti lato codice che risultano in errori inattesi, uno di questi è l'errore 'Cannot read property "0" of undefined' (Impossibile leggere la proprietà "0" da undefined), Fig. 1:
Uno dei casi in cui si può occorrere in tale errore si ha quando si tenta di accedere ad una proprietà di un oggetto JSON restituito da una chiamata ad un servizio di API interrogato con URLFetch tramite Google Apps Script (l'url seguente non è funzionante ma ha il solo scopo illustrativo di mostrare il comando appena descritto):
var response = UrlFetchApp.fetch("https://api.esempio-url-servizio-con-risposta-json...");
Logger.log(response);
Se, in un caso reale, provassimo a visualizzare (ad esempio con un Logger.log) il contenuto della variabile response, potremo vedere qualcosa di simile al seguente:
// {"dimensions":[{"value":"step 1","type":"Nome Step","measures":[{"name":"Avg View Time (Sec)","guid":"","value":268.67241379310343,"type":"sum"},{"name":"Users","guid":"","value":207,"type":"distinct"}]...
// Di seguito la forma indentata:
{
"dimensions":[
{
"value":"step 1",
"type":"Nome Step",
"measures":[
{
"name":"Avg View Time (Sec)",
"guid":"",
"value":268.67241379310343,
"type":"sum"
},
{
"name":"Users",
"guid":"",
"value":207,
"type":"distinct"
}
],
...
}
]
}
Ovvero un oggetto JSON correttamente costruito, tuttavia provando ad accedere alla sua prima proprietà, nel caso specifico la chiave dimensions come prima posizione del costrutto, con la seguente notazione:
Logger.log(response.dimensions[0]);
...otterrei l'errore incriminato, appunto: Impossibile leggere la proprietà "0" da undefined.
Questo succede perchè nonostante l'oggetto sia un JSON correttamente formattato non viene riconosciuto come tale nel contesto di utilizzo.
La soluzione: l'oggetto JSON ottenuto in risposta alla chiamata al servizio esterno ha bisogno di essere gestito con .getContentText() (che ottiene il contenuto di una risposta HTTP codificata come una stringa) e trasformato attraverso un JSON.parse:
response = JSON.parse(response.getContentText());
Logger.log(response);
Il risultato dell'elaborazione di cui sopra, visibile nel log, sarà il seguente:
{dimensions=[{measures=[{name=Avg View Time (Sec), guid=, type=sum, value=268.67241379310343}, {name=Users, guid=, type=distinct, value=207}], type=Nome Step, value=step 1,
E nonostante la formattazione non sia a questo punto quella a cui siamo solitamente abituati (notare il simbolo dell'uguale al posto di quello dei due punti e l'assenza delle virgolette ai parametri), sarà possibile adesso accedere al primo elemento dell'oggetto (così come agli altri eventuali elementi) con la notazione utilizzata in precedenza senza ricevere quel fastidioso errore.
Non ci sono commenti
Nessuno ha ancora commentato questo articolo, fallo tu per primo!
scrivi un commento