Javascript JSON.stringify序列化为[]
如果我创建一个JavaScript对象,如:Javascript JSON.stringify序列化为[],javascript,json,Javascript,Json,如果我创建一个JavaScript对象,如: var lst = []; var row = []; row.Col1 = 'val1'; row.Col2 = 'val2'; lst.push(row); 然后将其转换为字符串: JSON.stringify(lst); 结果是一个包含空对象的对象: [[]] 我希望它能像这样序列化: [[Col1 : 'val1', Col2: 'val2']] 为什么内部对象属性没有序列化 您将内部数组用作对象,因此将其设置为对象而不是数组 va
var lst = [];
var row = [];
row.Col1 = 'val1';
row.Col2 = 'val2';
lst.push(row);
然后将其转换为字符串:
JSON.stringify(lst);
结果是一个包含空对象的对象:
[[]]
我希望它能像这样序列化:
[[Col1 : 'val1', Col2: 'val2']]
为什么内部对象属性没有序列化
您将内部数组用作对象,因此将其设置为对象而不是数组
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);
将内部数组用作对象,因此将其作为对象而不是数组
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);
因为
行
是数组,而不是对象。将其更改为:
var row = {};
这将创建一个对象文本。然后,您的代码将生成一个对象数组(包含单个对象):
更新
要了解实际发生的情况,您可以查看。这是str
函数(由JSON.stringify
调用)中的一个(大幅缩减的)片段:
if(Object.prototype.toString.apply(value)='[Object Array]'){
//...
长度=value.length;
对于(i=0;i
请注意,数组通过正常的
for
循环进行迭代,该循环仅枚举数组元素。对象在循环中使用for…进行迭代,并使用hasOwnProperty
测试以确保proeprty实际上属于此对象。因为行
是数组,而不是对象。将其更改为:
var row = {};
这将创建一个对象文本。然后,您的代码将生成一个对象数组(包含单个对象):
更新
要了解实际发生的情况,您可以查看。这是str
函数(由JSON.stringify
调用)中的一个(大幅缩减的)片段:
if(Object.prototype.toString.apply(value)='[Object Array]'){
//...
长度=value.length;
对于(i=0;i
请注意,数组通过正常的for
循环进行迭代,该循环仅枚举数组元素。对象在
循环中使用for…进行迭代,并使用hasOwnProperty
测试以确保proeprty实际上属于此对象。您希望行是字典,而不是向量。定义如下:
var row = {};
您希望行是字典,而不是向量。定义如下:
var row = {};
由于数组是JSON中的数据类型,array
的实际实例的字符串化方式与其他对象类型不同
如果JavaScriptArray
实例在其非数字键完好无损的情况下被字符串化,那么它就不能用[…]
JSON数组语法表示
例如,[“Col1”:“val1”]
将无效,因为JSON数组不能有显式键。
{“Col1”:“val1”}
将是有效的-但它不是数组
当然,你不能混用n'match,然后得到{“Col1”:“val1”,1,2,3]
之类的东西
顺便说一句,这很管用:
var lst = [];
var row = {};
row.Col1 = 'val1';
row.Col2 = 'val2';
lst.push(row);
alert(JSON.stringify(lst));
由于数组是JSON中的数据类型,array
的实际实例的字符串化方式与其他对象类型不同
如果JavaScriptArray
实例在其非数字键完好无损的情况下被字符串化,那么它就不能用[…]
JSON数组语法表示
例如,[“Col1”:“val1”]
将无效,因为JSON数组不能有显式键。
{“Col1”:“val1”}
将是有效的-但它不是数组
当然,你不能混用n'match,然后得到{“Col1”:“val1”,1,2,3]
之类的东西
顺便说一句,这很管用:
var lst = [];
var row = {};
row.Col1 = 'val1';
row.Col2 = 'val2';
lst.push(row);
alert(JSON.stringify(lst));
因此,数组只序列化其1,2,3键,而不是像val1这样的随机名称?数组的内容将被序列化。当您尝试将值分配给数组对象的属性时,它实际上不会添加到数组中。嗯,添加属性的意义是它在调试器中变得可见。是的,它已添加到对象中(即Array
)的实例),但是JSON.stringify
只会序列化数组的内容,而不会序列化对象的任意属性(否则还会得到类似length
属性的内容)@Andomar-我更新了我的答案,更详细地了解了幕后的实际情况。因此,数组只序列化其1,2,3键,而不是像val1这样的随机名称?数组的内容将被序列化。当您尝试为数组对象的属性赋值时,它实际上不会被添加到数组中。好吧,正确的ty的添加是因为它在调试器中变得可见。是的,它被添加到对象(即Array
的实例),但是JSON。stringify
将只序列化数组的内容,而不会序列化对象的任意属性(否则还将获得length
属性)@Andomar-我更新了我的答案,更详细地了解了幕后的实际情况。访问。你会看到JSON有2种结构。一种允许键/值对,另一种是简单的有序列表。JavaScript对象序列化为键/值对,JavaScript数组序列化为有序列表。访问。你会看到JSON有2个结构。一个允许键/值对,另一个是简单的有序列表。JavaScript对象序列化为键/值对,JavaScript数组序列化为有序列表。谢谢,向上投票!James的回答让我看到{}
是一个对象,[]
是一个数组,向上投票!詹姆斯的回答让我看到{}
是一个对象,[]
是