2013-06-19 2 views
0

Я создал объект JS вроде этого:Добавление элемента в объект Javascript не работает, используя формат JSON

var JSONObject = {}; 

и функцию а создать элемент добавляет, что JSONObject:

function addShape(JSONObject, shapeStruct) 
{ 
    var sh = "shape"+shapeStruct.id.toString(); 
    JSONObject.sh={ 
    "id": shapeStruct.id, 
    "x1": shapeStruct.x1, 
    "x2": shapeStruct.x2, 
    "y1": shapeStruct.y1, 
    "y2": shapeStruct.y2 
    }; 
} 

эта функция находится в отдельном файле.

называть его я использовал:

shapeId++; 
singleShapeStruct = {"id":shapeId, "x1":oldX, "x2":correctedX, "y1":oldY, "y2":yCanvas}; 
addShape(JSONObject, singleShapeStruct); 
alert(JSONObject.shape0.x1); 

предупреждение не дает каких-либо вещь.

спасибо за любую помощь kinf

+0

FYI, нет ничего в вашем вопросе или коде, который имеет какое-либо отношение к JSON. '{}' - это * object literal * здесь, который представляет собой конструкцию синтаксиса для указания объекта. OTOH, JSON - это текстовый формат обмена данными, такой как XML или CSV. См. Alse: [Нет такой вещи, как «объект JSON»] (http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/). –

+0

@FelixKling я действительно запутался между концепцией JSON и объектами JS, спасибо, но можем ли мы сказать, что спецификация JSON. требует объект JS, когда он используется в контексте строки? –

+0

Я не уверен, что вы имеете в виду, но я добавлю еще несколько объяснений: если у вас есть текстовый файл, содержащий только, например. '[" foo "," bar "]', тогда у вас есть JSON. Если файл содержит 'var foo = [" foo "," bar "];', то у вас есть JavaScript, создающий массив. Если у вас есть 'var foo = '[" foo "," bar "]';', то у вас есть JavaScript, создающий строку, которая содержит данные в формате JSON. В исходном коде JavaScript JSON может существовать только внутри строк. Вы можете анализировать такие данные для объектов JS и массивов. –

ответ

2

При назначении ничего JSONObject.sh, он не будет использовать переменную sh. Имя свойства будет "sh", а не значение переменной sh.

Чтобы использовать переменную назвать свойство, используйте синтаксис брекет:

JSONObject[sh] = ... 
+0

Как я могу разобрать его и получить значение «x1», например? –

+0

@abualbara: Нет необходимости синтаксического анализа, поскольку он уже находится в форме объекта. Вы проанализировали бы его, если бы у вас была строка JSON, которую вам нужно было получить как объект. Чтобы получить доступ к свойствам объекта внутри вашего объекта, вы можете использовать имя свойства как 'JSONObject.shape0.x1' или синтаксис скобки' JSONObject ["shape0"]. X1'. Конечно, вы можете использовать переменную, чтобы указать строку в синтаксисе скобки. – Guffa

+0

ooh thanks, я хочу получить все атрибуты объекта: я использовал это: for (var i = 0; i

1

Поскольку у вас есть переменная, которая имеет действующий ключ, вы должны использовать bracket notation вместо dot notation как member operator

function addShape(JSONObject, shapeStruct) 
{ 
    var sh = "shape"+shapeStruct.id.toString(); 
    JSONObject[sh]={ 
    "id": shapeStruct.id, 
    "x1": shapeStruct.x1, 
    "x2": shapeStruct.x2, 
    "y1": shapeStruct.y1, 
    "y2": shapeStruct.y2 
    }; 
} 
0

Здесь JSONObject не содержит sh.

вы должны инициализировать объект JSONObject.sh в

JSONObject[sh] = 
{ 
    "id" : ..... 
    "x1" : ..... 
    . 
} 

с помощью квадратных скобках обозначения значения переменной, как имя (динамическая) .. Не по точечным оператором. Оператор dot требует статического имени инициализируемого свойства.

+0

* «Оператор точки объекта ссылается на существующее свойство» * Это неверно. 'var foo = {}; foo.bar = 42; 'отлично работает. –

+0

Да, вы правы. @FelixKling .. но здесь свойство внутри объекта не является статическим именем. построив как 'sh =" shape "+ shapeStruct.id.toString()'. 'foo.bar' - статическое имя, но' sh' не .. am i right? Прошу прощения, если я был не прав .... –

+0

Да. Если вы хотите использовать значение переменной как имя свойства, вы должны использовать нотацию в виде скобок. Не беспокойтесь, вы можете отредактировать свой ответ и исправить его :) –

Смежные вопросы