【问题标题】:JSON.stringify serializes to [[]]JSON.stringify 序列化为 [[]]
【发布时间】:2012-02-21 01:53:00
【问题描述】:

如果我创建一个 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.

【问题讨论】:

  • 访问json.org。您会看到 JSON 有 2 个结构。一个允许键/值对,另一个是简单的有序列表。 JavaScript 对象序列化为键/值对,JavaScript 数组序列化为有序列表。

标签: javascript json


【解决方案1】:

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

var row = {};  

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

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

更新

要了解实际情况,您可以查看json2.js on GitHub。这是来自str 函数(由JSON.stringify 调用)的(大大减少的)sn-p:

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 测试以确保属性实际上属于该对象。

【讨论】:

  • 所以一个数组只序列化它的 1,2,3 个键,而不是像 val1 这样的随机名称?
  • 数组的内容会被序列化。当您尝试为数组对象的属性赋值时,它实际上并没有被添加到数组中。
  • 好吧,添加属性是因为它在调试器中变得可见。
  • 是的,它被添加到对象(Array 的那个实例),但JSON.stringify 只会序列化数组的内容,而不是对象的任意属性(否则你也会获取类似length 属性的东西)。
  • @Andomar - 我已经更新了我的答案,详细说明了幕后实际发生的事情。
【解决方案2】:

你使用你的内部数组就像一个对象,所以让它成为一个对象而不是一个数组。

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

【讨论】:

  • 谢谢,点赞!是 James 的回答让我看到 {} 是一个对象,[] 是一个数组
【解决方案3】:

您希望 row 成为字典,而不是向量。像这样定义它:

var row = {};

【讨论】:

    【解决方案4】:

    由于数组是 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));​
    

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 2012-09-04
      • 2017-11-03
      • 2019-03-24
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      相关资源
      最近更新 更多