Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON.stringify序列化为[]_Javascript_Json - Fatal编程技术网

Javascript JSON.stringify序列化为[]

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

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

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
的实际实例的字符串化方式与其他对象类型不同

如果JavaScript
Array
实例在其非数字键完好无损的情况下被字符串化,那么它就不能用
[…]
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
的实际实例的字符串化方式与其他对象类型不同

如果JavaScript
Array
实例在其非数字键完好无损的情况下被字符串化,那么它就不能用
[…]
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的回答让我看到
{}
是一个对象,
[]
是一个数组,向上投票!詹姆斯的回答让我看到
{}
是一个对象,
[]