JSON.stringify不能用于正常的Javascript数组

我必须在这里丢失一些东西,但下面的代码( Fiddle )返回一个空string:

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

JSON处理这个数组的正确方法是什么?

普通的JavaScript数组被devise为用数字索引保存数据。 你可以将命名键填充到它们(当你想存储一个数组的元数据时,这个数组可以保存正常的,有序的,数字化的索引数据),但是这不是他们devise的。 JSON数组数据types不能在数组上具有命名键。

如果你想要命名的键,使用一个对象,而不是一个数组。

 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); 

上面的很好的解释和例子。 我发现这个( JSON.stringify()数组离奇与Prototype.js )来完成答案。 有些网站使用JSONFilters实现自己的toJSON,所以删除它。

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

它工作正常,testing的输出:

 console.log(json); 

结果:

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

我在这里发布了一个修复

你可以使用这个函数来修改JSON.stringify来对arrays进行编码,只要将它贴在脚本的开头就可以了(更多细节请查看上面的链接):

 // 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); }; })(); 

或者,你可以使用这样的

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

像这样你JSON数组。

Json必须有键值对。 你仍然可以有一个数组作为价值的一部分。 因此,添加您的chousing的“钥匙”:

var json = JSON.stringify({whatver:test});