Настоящая причина того, почему ключи JSON должны быть в кавычках, основывается на семантике идентификаторов ECMAScript 3.
Зарезервированные слова нельзя использовать в качестве имен свойств в объектных литералах без кавычек, например:
({function: 0})
({if: 0})
({true: 0})
Хотя, если вы используете кавычки, имена свойств действительны:
({"function": 0})
({"if": 0})
({"true": 0})
Собственный Крокфорд объясняет это в этом выступлении , они хотели сохранить простоту стандарта JSON и не хотели бы налагать на него все эти семантические ограничения:
....
Именно тогда мы обнаружили проблему с именем без кавычек. Оказывается, в сценарии ECMA 3 используется политика зарезервированных слов для взлома. Зарезервированные слова необходимо цитировать в ключевой позиции, что действительно неприятно. Когда я добрался до формулировки этого стандарта, я не хотел помещать все зарезервированные слова в стандарт, потому что это выглядело бы очень глупо.
В то время я пытался убедить людей: да, вы можете писать приложения на JavaScript, он действительно будет работать, и это хороший язык. Тогда я не хотел одновременно говорить: и посмотрите на эту действительно глупую вещь, которую они сделали! Поэтому я решил вместо этого просто процитировать ключи.
Таким образом, нам не нужно никому рассказывать о том, насколько это круто.
Вот почему по сей день ключи цитируются в JSON.
...
Стандарт ECMAScript 5th Edition исправляет это, теперь в реализации ES5 даже зарезервированные слова могут использоваться без кавычек как в литералах объектов, так и в доступе к членам ( obj.function
нормально в ES5).
Для записи, этот стандарт внедряется в наши дни поставщиками программного обеспечения, вы можете увидеть, какие браузеры включают эту функцию в этой таблице совместимости (см. Зарезервированные слова как имена свойств )