JSON.stringify不适用于普通的Javascript数组

时间:2013-04-24 15:41:38

标签: javascript json

我必须在这里遗漏一些内容,但以下代码(Fiddle)会返回一个空字符串:

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

JSON这个阵列的正确方法是什么?

7 个答案:

答案 0 :(得分:103)

普通JavaScript数组旨在使用 numeric 索引保存数据。您可以将命名键填充到它们上(当您想要存储关于包含正常,有序,数字索引数据的数组的元数据时,这可能很有用),但这不是它们的设计目的。 JSON数组数据类型不能在数组上具有命名键。

如果需要命名键,请使用Object,而不是Array。

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

答案 1 :(得分:8)

上面的好解释和例子。我找到了这个(JSON.stringify() array bizarreness with 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"]}"

答案 2 :(得分:5)

我发布了此here

的修补程序

您可以使用此功能修改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);
    };
})();

答案 3 :(得分:1)

或者你也可以这样使用

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一个数组。

答案 4 :(得分:0)

另一种方法是JSON.stringify() replacer function param。您可以将第二个参数传递给 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; }); ,它对空数组进行特殊处理,如下所示。

--query

答案 5 :(得分:-1)

尝试使用Push方法。 不要创建关联数组。它将与简单的索引数组一起使用。

var test = [];
test.push('test');
test.push('sid');
var json = JSON.stringify(test);
alert(json);

答案 6 :(得分:-5)

Json必须拥有键值对。你仍然可以将一个数组作为值部分。因此,添加一个"键"你的选择:

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