带有属性的JSON数组

时间:2011-04-08 16:26:37

标签: javascript json

我有以下js数组/对象

var x = [1,2,3,4]; 
x.name = "myArray"; 

我正在使用json2.js,我正在尝试在字符串中序列化x。 而我得到的就是数组: [1,2,3,4]

是正确的吗? 因为我可以将任何属性添加到数组中为什么json2不处理它? 我错过了什么?

4 个答案:

答案 0 :(得分:3)

  1. 首先,json2.js会忽略数组中的属性。
  2. 如果它不能忽略它们那么就不可能有一个json格式的数组,这应该很容易评估。
  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中看到这个:

enter image description here

数组对象有一个名为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代码不会这样看,为什么不将它转换为对象?