如果我创建一个JavaScript对象,如:
var lst = [];
var row = [];
row.Col1 = 'val1';
row.Col2 = 'val2';
lst.push(row);
然后将其转换为字符串:
JSON.stringify(lst);
结果是一个包含空对象的对象:
[[]]
我希望它能像以下一样序列化:
[[Col1 : 'val1', Col2: 'val2']]
为什么内部对象属性不能序列化?
答案 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));