我一定在这里遗漏了一些东西,但以下代码(Fiddle)返回一个空字符串:
var test = new Array();
test['a'] = 'test';
test['b'] = 'test b';
var json = JSON.stringify(test);
alert(json);
JSON'ing 这个数组的正确方法是什么?
我一定在这里遗漏了一些东西,但以下代码(Fiddle)返回一个空字符串:
var test = new Array();
test['a'] = 'test';
test['b'] = 'test b';
var json = JSON.stringify(test);
alert(json);
JSON'ing 这个数组的正确方法是什么?
JavaScript 数组旨在保存带有数字索引的数据。您可以向它们添加命名属性,因为数组是一种对象类型(这在您想要存储有关包含普通、有序、数字索引数据的数组的元数据时很有用),但这不是它们的设计初衷为了。
JSON 数组数据类型不能在数组上具有命名键。
当您将 JavaScript 数组传递给JSON.stringify
命名属性时,将被忽略。
如果您想要命名属性,请使用对象,而不是数组。
const test = {}; // Object
test.a = 'test';
test.b = []; // Array
test.b.push('item');
test.b.push('item2');
test.b.push('item3');
test.b.item4 = "A value"; // Ignored by JSON.stringify
const json = JSON.stringify(test);
console.log(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;
}
它工作正常并且测试的输出:
console.log(json);
结果:
"{"a":"test","b":["item","item2","item3"]}"
我在这里发布了一个修复程序
您可以使用此函数修改JSON.stringify
为 encode 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-ing 一个数组。
另一种方法是JSON.stringify()
替换函数 param。您可以将第二个参数传递给JSON.stringify()
对空数组进行特殊处理的参数,如下所示。
const arr = new Array();
arr.answer = 42;
// {"hello":"world","arr":{"answer":42}}
JSON.stringify({ hello: 'world', arr }, function replacer(key, value) {
if (Array.isArray(value) && value.length === 0) {
return { ...value }; // Converts empty array with string properties into a POJO
}
return value;
});