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