JSON.stringify序列化为[[]]

时间:2012-02-20 17:31:47

标签: javascript json

如果我创建一个JavaScript对象,如:

var lst = [];
var row = [];
row.Col1 = 'val1';
row.Col2 = 'val2'; 
lst.push(row);

然后将其转换为字符串:

JSON.stringify(lst);

结果是一个包含空对象的对象:

[[]]

我希望它能像以下一样序列化:

[[Col1 : 'val1', Col2: 'val2']]

为什么内部对象属性不能序列化?

Code snippet at JSFiddle.

4 个答案:

答案 0 :(得分:4)

因为row是一个数组,而不是一个对象。将其更改为:

var row = {};  

这会创建一个对象文字。然后,您的代码将生成一个对象数组(包含单个对象):

[{"Col1":"val1","Col2":"val2"}]

<强>更新

要了解到底发生了什么,您可以查看json2.js on GitHub。这是str函数(由JSON.stringify调用)的(大幅减少)代码段:

if (Object.prototype.toString.apply(value) === '[object Array]') {
    //...
    length = value.length;
    for (i = 0; i < length; i += 1) {
        partial[i] = str(i, value) || 'null';
    }
    //...
}
//...
for (k in value) {
    if (Object.prototype.hasOwnProperty.call(value, k)) {
        //...
    }
    //...
}
//...

请注意,数组是使用普通for循环迭代的,它只枚举数组元素。使用for...in循环迭代对象,并使用hasOwnProperty测试确保proeprty实际属于此对象。

答案 1 :(得分:3)

您将内部数组用作对象,因此请将其设为对象而不是数组。

var lst = [];
var row = {};
row.Col1 = 'val1';
row.Col2 = 'val2'; 
lst.push(row);

或将其用作数组

var lst = [];
var row = {};
row.push( 'val1' );
row.push( 'val2' );
lst.push(row);

答案 2 :(得分:1)

您希望行是字典,而不是矢量。像这样定义:

var row = {};

答案 3 :(得分:1)

由于数组是JSON中的数据类型,Array的实际实例的字符串化方式与其他对象类型不同。

如果JavaScript Array实例的字符串化非完整的非数字键,则无法用[ ... ] JSON数组语法表示。

例如,[ "Col1": "val1"]无效,因为JSON数组不能有明确的键 {"Col1": "val1"}有效 - 但它不是数组。

你当然不能混合''匹配并获得{ "Col1": "val1", 1, 2, 3 ]或其他东西。

顺便说一句,这很好用:

var lst = [];
var row = {};
row.Col1 = 'val1';
row.Col2 = 'val2'; 
lst.push(row);
alert(JSON.stringify(lst));​