【问题标题】:Serializing a Javascript object with contained arrays to json?将包含数组的Javascript对象序列化为json?
【发布时间】:2011-10-20 02:25:23
【问题描述】:

我有一个 javascript 对象,其中包含一些包含关联数组的对象。我一直在尝试使用 json2.js 库的 stringify 函数,但输出不包含包含的对象成员中保存的数组。 在我的代码中,我从这样的东西开始

obj = {"arr1" : [], "arr2" : [], "arr3" : []};

然后我用填充每个包含的数组的循环添加到它

obj[arr*].push[arritem*];
obj[arr*][arritem*] = something;

我输入的 arr* 和 arritem* 只是为了表示我为循环输入的变量。 我尝试 Json.stringify(obj) 但我得到的字符串是

'{"arr1" : [0], "arr2" : [0], "arr3" : [0]}'

我希望看到输出

'{"arr1" : [ "arritem1" : something, "arritem2" : something2], "arr2" : [ "arritem1" : something, "arritem2" : something2], "arr3" : [ "arritem1" : something, "arritem2" : something2]}'

是否有更好的库来解决这个问题,或者在精简之前我需要做些什么?

【问题讨论】:

  • 您能提供更精确的输入/输出示例吗?你的肯定有不一致的地方。

标签: javascript arrays json associative stringify


【解决方案1】:
var obj = {"arr1" : [], "arr2" : [], "arr3" : []};
console.log(JSON.stringify(obj));

Works for me.

填充数组works too


更新

您暗示您正在尝试将具有非数字键的元素添加到数组中。

这是无效的。特别是,您想要的输出是 not 有效的 JSON。数组只有 数字键,它们不包含在 JSON 本身中,因为它们是隐式的、顺序定义的。

数组是一种特殊类型的对象,它为您处理数字索引。

var arr = [];   // Create array.
arr.push(1);    // There is now one element, with index 0 and value 1.
arr["txt"] = 2; // You tried to create a new element,
                // but didn't use .push and gave a non-numeric key.
                // This broke your array.

console.log(JSON.stringify(arr));
// Output: [1]

Live demo.

长话短说...不要这样做。如果您想要一个“关联数组”,请坚持使用基本对象:

var obj    = {}; // Create object.
obj[0]     = 1;  // There is now one element, with key "0" and value 1.
obj["txt"] = 2;  // There is now a second element, with key "txt" and value 2.

console.log(JSON.stringify(arr));
// Output: {"0":1,"txt":2}

Live demo.

【讨论】:

  • @gman060692:Javascript 没有关联数组。它有对象;对象的子集是 [数字索引] 数组。如果您尝试将非数字键推送到数组中,那么这就是您的问题。
  • 在我的 javascript 代码中引用数组项时,非数字键可以正常工作,也许 firefox 可以处理 javascript 中的关联数组,但 stringify 函数不能。还是它只是创建分层对象而不是数组。
  • @gman060692:不,数组没有非数字键。您可以检索在数组的基础对象上设置的属性值,因为这就是数组的实现方式以及 Javascript 的工作方式,但这些非数字键项不是实际数组数据的一部分。使用这样的数组无效。希望我更新的答案能为您解决问题。
  • @gman060692:一个基本对象,就像我的最后一个示例一样。这就是你可能称之为“关联数组”的东西,尽管这个术语不能严格导入到 Javascript 环境中!你的完整对象的封闭符号是 {} 不是愚蠢的。
  • @gman060692:没问题。欢迎来到堆栈溢出。愿您的访问长久而繁荣。
【解决方案2】:
obj.toSource()

这会将您的数组转换为源字符串。

【讨论】:

  • Chrome好像没有这个功能?
猜你喜欢
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多