Подтвердить что ты не робот

Синтаксис JSON для имен свойств

Каков правильный синтаксис для создания объектов в javascript, который будет работать в большинстве веб-браузеров (я имею в виду: IE 6+, Firefox 2+, Opera 9+)

Является ли это действительным


var a={ "class": "Person", 
        "name": "William Shakespeare",
        "birthday": -12802392000000, 
        "nickname": "Bill" 
       } ;

Или это:


var a={ class: "Person", 
        name: "William Shakespeare",
        birthday: -12802392000000, 
        nickname: "Bill" 
       } ;

И в чем разница между этими двумя?

4b9b3361

Ответ 1

@AndreasN верен: спецификация JSON диктует использование котировок для того, чтобы он фактически был JSON. Если вы не используете кавычки, это может быть допустимый литерал объекта в Javascript, но это не JSON. Другие сервисы, помимо Javascript на стороне браузера, используют JSON (например, веб-службы, использующие php, Java и т.д.), И если вы создаете строку, в которой отсутствуют кавычки, нет никакой гарантии, что она будет проанализирована правильно - хотя я подозреваю, что большинство реализаций будут достаточно прочны для этого.

FYI в Javascript опасно напрямую использовать eval() для строк JSON из источников, которые вы не можете предотвратить злонамеренные атаки. Опять же, см. сайт JSON, который дает больше объяснений, а также очень короткий файл javascript, который безопасно анализирует строки JSON в объектах Javascript.

edit: Я предполагаю, что технически ваш оригинальный вопрос касается не JSON, а синтаксиса Javascript для литералов объектов. Разница заключается в том, что объекты, конструируемые из строки JSON, будут исключать многие другие возможные литералы объектов, например:

var a = {cat: "meow", dog: "woof"};
var aname = {cat: "Garfield", dog: "Odie"};
var b = {
  counter: 0,
  pow: function(x) { return x+1; },
  zap: function(y) { return (counter += y); }
};
var c = {
  all: [a,aname],
  animals: a,
  names: aname,
};

Объектные литералы "a" и "aname" могут быть выражены в JSON (путем добавления котировок к именам свойств). Но объектные литералы "b" и "c" не могут. Литерал объекта "b" содержит функции (не разрешенные в JSON). Литеральный объект "c" выше содержит ссылки на другие переменные таким образом, который не представляется в JSON, потому что некоторые ссылки являются общими. Если вы внесете изменение в c.names, оно также изменит c.all[1], поскольку они имеют ссылку на одну и ту же переменную. JSON может только выражать объекты, которые имеют древовидную структуру (например, каждый подэлемент общего объекта является независимым).

Ответ 2

Если IE завершится неудачей с вашим вторым примером, потому что "Класс" является зарезервированным словом (только в IE). Вообще говоря, всегда лучше всего приложить свои имена свойств кавычками - это означает, что он ВСЕГДА будет работать, независимо от обстоятельств.

Ответ 3

spec говорят, чтобы использовать "".

Firefox принимает без, но IE не делает.

Пара определяется как

string : value

Значение может быть строкой строка определяется как

" chars "

Ответ 4

Вы должны использовать "кавычки" вокруг свойств, которые содержат что-либо, кроме символов слова

{foo-bar: 3} // invalid
{"foo-bar": 3} // valid

Кроме того, нет никакой разницы между этими двумя, и я бы предположил, что оба способа работают во всех браузерах