JSON массив со свойствами - PullRequest
       4

JSON массив со свойствами

7 голосов
/ 08 апреля 2011

У меня есть следующий массив / объект js

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

Я использую json2.js и пытаюсь сериализовать x в строку. и все, что я получаю, это массив: [1,2,3,4]

это правильно? так как я могу добавить любое свойство в массив, почему json2 не обрабатывает это? что мне не хватает?

Ответы [ 4 ]

3 голосов
/ 14 апреля 2011
  1. Прежде всего json2.js игнорирует свойства в массиве.
  2. Если бы он не игнорировал их, тогда было бы невозможно получить массив в формате json, который должен быть прост в оценке.

Давайте представим, что у нас получилось что-то вроде:

[1,2,3,4]{name:'test',anotherProperty:'someValue'} 

, если выше было допустимым JavaScript для создания массива и прикрепления двух свойств, тогда было бы здорово, и мы могли бы json-Это.Было бы эквивалентно сделать это:

array = [1,2,3,4]
array.name = 'test';
array.anotherProperty = 'someValue'; 

Но это не так, и именно поэтому мы не можем продолжать в json.

2 голосов
/ 08 апреля 2011

Что вы ожидали увидеть? :) Я не уверен, что ты пытаешься сделать.

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 даст вам имя.

EDIT

Это в ответ на ваши комментарии. Хотя верно, что массивы могут быть обогащены свойствами, подумайте о том, что это значит, когда вам нужно сериализовать этот объект. Что именно вы хотите увидеть, когда сериализуете 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 совершенно разные.

Если вы хотите сериализовать эти дополнительные свойства, вам придется написать свой собственный сериализатор, который будет перебирать свойства массива и представлять все в карте / ассоциативном массиве. Это единственный способ; предостережение, как я упоминал ранее, заключается в том, что у вас больше нет фактического массива.

0 голосов
/ 08 апреля 2011

Не знаю, зачем вам это делать, но цикл 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 не увидит его таким образом, почемуВы не конвертируете это в объект?

0 голосов
/ 08 апреля 2011

Проблема в том, что 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);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...