我有以下js数组/对象
var x = [1,2,3,4];
x.name = "myArray";
我正在使用json2.js,我正在尝试在字符串中序列化x。 而我得到的就是数组: [1,2,3,4]
是正确的吗? 因为我可以将任何属性添加到数组中为什么json2不处理它? 我错过了什么?
答案 0 :(得分:3)
让我们假设我们出现了类似的东西:
[1,2,3,4]{name:'test',anotherProperty:'someValue'}
如果以上是有效的javascript来创建一个数组并坚持两个属性那么它会很棒我们可以json-it。 这相当于这样做:
array = [1,2,3,4]
array.name = 'test';
array.anotherProperty = 'someValue';
但事实并非如此,这就是为什么我们不能坚持到json的原因。
答案 1 :(得分:2)
你期待看到什么? :)我不确定你要做什么。
x
是一个数组,当你执行x.name
时所做的一切,你只需为数组对象设置一个名为name
的属性。 name
属性本身未添加到数组中。你可以在firebug中看到这个:
数组对象有一个名为name
的属性,但该属性的值不会添加到数组本身。
你想要做的是这样的事情:
var x = {
array: [1, 2, 3, 4],
name: "myArray"
};
现在您有一个名为x
的对象,它有两个属性。 array
属性引用数组,name
属性引用名称。 x.array
将为您提供数组,x.name
将为您提供名称。
修改强>
这是对您的评论的回应。虽然数组可以使用属性进行丰富,但是在必须序列化该对象时,请考虑它的含义。在序列化x
时,您希望看到什么?如果x
已经是数组[1, 2, 3, 4]
,您将如何用JSON表示它?您可以将其表示为:
{ 0: 1,
1: 2,
2: 3,
3: 4,
name: "myArray"
};
但你现在拥有的不再是一个数组。此外,数组对象本身具有一堆本机属性。 JSON序列化器应如何处理这些?
我认为你将一个数组混合为一个对象,一个数组混合为一个文字。作为文字的数组只是[1, 2, 3, 4]
。现在在内部,作为对象的数组可能具有一些指向数组实际值的属性。它还有其他属性(如length
)和作用于它的方法(如slice
)。
JSON序列化程序关注对象的值。如果x
是数组,则必须序列化的内容是x
的值,即[1, 2, 3, 4]
。 x
的属性完全不同。
如果要序列化这些附加属性,则必须编写自己的序列化程序,它将遍历数组的属性并表示map / associative数组中的所有内容。这是唯一的方法;正如我之前提到的那样,警告是你不再拥有一个真正的数组。
答案 2 :(得分:0)
问题是json2仍然认为它是一个数组,因为x instanceof Array
返回true。要修复它,您可以以环形方式创建“数组”:
var x = {
0: 1,
1: 2,
2: 3,
3: 4,
length: 4,
name: 'myArray'
};
此解决方案的问题是对象上没有任何数组方法可用。因此,如果您需要使用pop,push等,则必须使用Array.prototype.slice.call(x);
将其转换为实数数组,或者如果您需要字节数[].slice.call(x);
。
答案 3 :(得分:0)
不确定为什么要这样做,但for循环会得到一切
var x = [1,2,3];
x.name = "wtf";
for(var y in x){
console.log(y + ":\t" + x[y]);
}
产地:
0: 1
1: 2
2: 3
name: wtf
但json2代码不会这样看,为什么不将它转换为对象?