Синтаксис JSON для имен свойств - PullRequest
28 голосов
/ 19 декабря 2008

Какой правильный синтаксис для создания объектов в 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" 
       } ;

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

Ответы [ 4 ]

31 голосов
/ 19 декабря 2008

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

Кстати, в 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 может выражать только объекты, имеющие древовидную структуру (например, каждый подэлемент всего объекта является независимым).

8 голосов
/ 19 декабря 2008

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

7 голосов
/ 19 декабря 2008

spec говорят, что используют "".

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

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

string : value

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

" chars "
5 голосов
/ 19 декабря 2008

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

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

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

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