Oggi mi sono imbattuto in un inaspettato problema utilizzando le liberie JSON (www.json.org): "JSON does not support cyclic data structures".
Infatti utilizzando un Array multidimensionale potreste provare il mio stesso stupore:
questo codice infatti vi mostrerà un array VUOTO.
<script type="text/javascript" src="json2.js"></script>
<script>
var Auto = new Array();
Auto[0] = new Array();
Auto[0]['marca'] = "BMW";
Auto[0]['nazionalita'] = "Tedesca";
Auto[1] = new Array();
Auto[1]['marca'] = "Fiat";
Auto[1]['nazionalita'] = "Italiana";
var JSONText = JSON.stringify(Auto);
alert(JSONText);
</script>
Come risolvere il problema? E’ presto detto:
trasformare il nostro Array (e i suoi figli) in un oggetto (di tipo Object) e per fare ciò ecco un’utilissima funzione:
array2obj.js
/**
* Returns an Object with same structure and content of a given array
* Useful for Array to Object convertion required for JSON stringify()
*
* @author Alessandro Coscia
* @see www.programmatorephp.it
* @param Array array
* @return Object
*/
function array2obj(array) {
var obj = new Object();
for (var label in array) {
obj[label] = new Object();
// Recursion if needed
if (typeof array[label] == "object") {
obj[label] = array2obj(array[label]);
}
// Simple vars
else
obj[label] = array[label];
}
return obj;
}
Come usarla? Ecco qui l’esempio completo:
<script type="text/javascript" src="json2.js"></script>
<script type="text/javascript" src="array2obj.js"></script>
<script>
var Auto = new Array();
Auto[0] = new Array();
Auto[0]['marca'] = "BMW";
Auto[0]['nazionalita'] = "Tedesca";
Auto[1] = new Array();
Auto[1]['marca'] = "Fiat";
Auto[1]['nazionalita'] = "Italiana";
// Questo non funzionera'
var JSONText = JSON.stringify(Auto);
alert(JSONText);
// Questo funzionera'
Auto = array2obj(Auto);
var JSONText = JSON.stringify(Auto);
alert(JSONText);
</script>
Con questo semplice tip potrete essere liberi di utilizzare array ed array associativi nelle vostre applicazioni AJAX che fanno uso di JSON.
Buon coding!
ps: dove trovare il file json2.js? Sul sito ufficiale: http://www.json.org/json2.js