web-dev-qa-db-fra.com

JSON.stringify ne fonctionne pas avec un tableau Javascript normal

Il me manque quelque chose ici, mais le code suivant ( Fiddle ) renvoie une chaîne vide:

var test = new Array();
test['a'] = 'test';
test['b'] = 'test b';
var json = JSON.stringify(test);
alert(json);

Quelle est la bonne façon de faire JSON ce tableau?

49
Sherlock

Les tableaux JavaScript normaux sont conçus pour contenir des données avec numeric index. Vous pouvez y insérer des clés nommées (ce qui peut être utile lorsque vous souhaitez stocker des métadonnées sur un tableau contenant des données normales, ordonnées et indexées numériquement), mais ce n'est pas pour cela qu'elles sont conçues. Le type de données du tableau JSON ne peut pas avoir les clés nommées sur un tableau.

Si vous voulez des clés nommées, utilisez un objet, pas un tableau.

var test = {};           // Object
test['a'] = 'test';
test['b'] = [];          // Array
test['b'].Push('item');
test['b'].Push('item2');
test['b'].Push('item3');
var json = JSON.stringify(test);
alert(json);
97
Quentin

Belle explication et exemple ci-dessus. J'ai trouvé ce ( JSON.stringify () tableau bizarreness avec Prototype.js ) pour compléter la réponse. Certains sites implémentent leur propre toJSON avec JSONFilters, supprimez-le. 

if(window.Prototype) {
    delete Object.prototype.toJSON;
    delete Array.prototype.toJSON;
    delete Hash.prototype.toJSON;
    delete String.prototype.toJSON;
}

cela fonctionne bien et la sortie du test:

console.log(json);

Résultat: 

"{"a":"test","b":["item","item2","item3"]}"
8

J'ai posté un correctif pour cela ici

Vous pouvez utiliser cette fonction pour modifier JSON.stringify afin de coder arrays, postez-le simplement au début de votre script (consultez le lien ci-dessus pour plus de détails):

// Upgrade for JSON.stringify, updated to allow arrays
(function(){
    // Convert array to object
    var convArrToObj = function(array){
        var thisEleObj = new Object();
        if(typeof array == "object"){
            for(var i in array){
                var thisEle = convArrToObj(array[i]);
                thisEleObj[i] = thisEle;
            }
        }else {
            thisEleObj = array;
        }
        return thisEleObj;
    };
    var oldJSONStringify = JSON.stringify;
    JSON.stringify = function(input){
        if(oldJSONStringify(input) == '[]')
            return oldJSONStringify(convArrToObj(input));
        else
            return oldJSONStringify(input);
    };
})();
5
JVE999

Sinon, vous pouvez utiliser comme ça

var test = new Array();
test[0]={};
test[0]['a'] = 'test';
test[1]={};
test[1]['b'] = 'test b';
var json = JSON.stringify(test);
alert(json);

Comme ceci, vous JSON-ing un tableau.

1
user4023394