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