Согласно Крокфорду в json.org , JSON объект состоит из элементов , которые состоят из пар .
Каждая пара состоит из строки и значения , при этом строка определяется как:
Строка - это последовательность из нуля или более символов Юникода, заключенная в двойные кавычки с использованием экранирования обратной косой черты. Символ представлен в виде односимвольной строки. Строка очень похожа на строку C или Java.
Но на практике большинство программистов даже не знают, что ключ JSON должен быть заключен в двойные кавычки, потому что большинство браузеров не требуют использования двойных кавычек.
Есть ли смысл заключать JSON в двойные кавычки?
Действительный пример:
{
"keyName" : 34
}
В отличие от инвалида:
{
keyName : 34
}
javascript
json
browser
double-quotes
Марк Роджерс
источник
источник
Ответы:
Настоящая причина того, почему ключи JSON должны быть в кавычках, основывается на семантике идентификаторов ECMAScript 3.
Зарезервированные слова нельзя использовать в качестве имен свойств в объектных литералах без кавычек, например:
({function: 0}) // SyntaxError ({if: 0}) // SyntaxError ({true: 0}) // SyntaxError // etc...
Хотя, если вы используете кавычки, имена свойств действительны:
({"function": 0}) // Ok ({"if": 0}) // Ok ({"true": 0}) // Ok
Собственный Крокфорд объясняет это в этом выступлении , они хотели сохранить простоту стандарта JSON и не хотели бы налагать на него все эти семантические ограничения:
Стандарт ECMAScript 5th Edition исправляет это, теперь в реализации ES5 даже зарезервированные слова могут использоваться без кавычек как в литералах объектов, так и в доступе к членам (
obj.function
нормально в ES5).Для записи, этот стандарт внедряется в наши дни поставщиками программного обеспечения, вы можете увидеть, какие браузеры включают эту функцию в этой таблице совместимости (см. Зарезервированные слова как имена свойств )
источник
parse
и совместимыеstringify
методы.Да, это недопустимый JSON, и во многих случаях он будет отклонен, например, в jQuery 1.4+ есть проверка, которая заставляет JSON без кавычек молча терпеть неудачу. Почему бы не соответствовать требованиям?
Возьмем другой пример:
{ myKey: "value" } { my-Key: "value" } { my-Key[]: "value" }
... все они будут действительны в кавычки, то почему бы не быть последовательным и использовать их во всех случаях, исключая возможность проблемы?
Еще один распространенный пример в мире веб-разработчиков: существуют тысячи примеров недействительного HTML, который отображается в большинстве браузеров ... делает ли это менее болезненным отладку или поддержку? Вовсе нет, совсем наоборот.
Также @ Matthew делает лучшее из всех в комментариях ниже, это уже не работает, ключи без кавычек будут вызывать синтаксическую ошибку
JSON.parse()
во всех основных браузерах (и любых других, которые реализуют это правильно), вы можете проверить это здесь .источник
JSON.parse
также правильно отклонят его.YAML, который на самом деле является расширенным набором JSON, поддерживает то, что вы хотите делать. Хотя это расширенный набор, он позволяет сделать его настолько простым, насколько вы хотите.
YAML - это глоток свежего воздуха, и, возможно, стоит потратить время на то, чтобы взглянуть на него. Лучшее место для начала здесь: http://en.wikipedia.org/wiki/YAML
Существуют библиотеки для всех языков под солнцем, включая JS, например https://github.com/nodeca/js-yaml
источник