Есть ли практическая причина использовать строки в кавычках для ключей JSON?

Согласно json.org Крокфорда, объект JSON состоит из члены, который состоит из пар.

Каждая пара состоит из строки и значения, причем строка определяется как:

Строка - это последовательность из нуля или более символов Юникода, заключенная в двойные кавычки с использованием экранирования обратной косой черты. Символ представлен в виде односимвольной строки. Строка очень похожа на строку C или Java.

Но на практике большинство программистов даже не знают, что ключ JSON должен быть заключен в двойные кавычки, потому что большинство браузеров не требуют использования двойных кавычек.

Есть ли смысл заключать JSON в двойные кавычки?

Действительный пример:

{
  "keyName" : 34
}

В отличие от инвалида:

{
   keyName : 34
}

person Mark Rogers    schedule 17.11.2010    source источник
comment
Зачем делать это правильно? Это вид ленивого мышления, который приводит к тому, что веб-сайты нагружены недопустимой разметкой. Сделайте свой код перспективным на случай, если какой-либо браузер действительно требует двойных кавычек.   -  person meagar    schedule 17.11.2010
comment
Зачем делать это правильно? - Зачем следовать условности, которую никто другой не делает, если от этого нет реальной выгоды? Возможно, вы путаете ленивое мышление с прагматизмом.   -  person Mark Rogers    schedule 17.11.2010
comment
@Mark - этого никто не знает ... с чего вы взяли эту идею? сериализатор JSON, встроенный в каждую основную платформу, правильно цитирует.   -  person Nick Craver    schedule 17.11.2010
comment
@Nick Craver - Спросите своего среднего веб-разработчика, вы, вероятно, получите подозрительный взгляд. Поскольку большинство браузеров допускают недопустимый json, большинство не знают об этом требовании для действительности.   -  person Mark Rogers    schedule 17.11.2010
comment
Функция @Mark Rogers PHP json_encode создает действительный JSON, например, со строками в двойных кавычках. Может быть, вы думаете об объектных литералах в JavaScript? Верно, что они работают без цитирования ключей, но это не JSON.   -  person JAL    schedule 17.11.2010
comment
@Mark - Нет браузеров допускают недопустимый JSON в своих JSON.parse() (что еще вы бы использовали?), Я показал демонстрацию этого в ответе ниже.   -  person Nick Craver    schedule 17.11.2010
comment
Для записи, много лет назад, когда я опубликовал это, меня смутила разница между JSON и обозначением объектных литералов, как предлагал @JAL. Оба имеют очень похожий синтаксис, что в конечном итоге привело к некоторой путанице в описании проблемы.   -  person Mark Rogers    schedule 15.04.2015
comment
@MarkRogers Может быть, вам стоит упомянуть об этом недоразумении как об изменении исходного вопроса? В противном случае это может запутать некоторых людей.   -  person ba_ul    schedule 29.08.2015
comment
@ba_ul - я предпочитаю оставить это так, чтобы люди могли следить за рассуждениями, начиная с недоразумения.   -  person Mark Rogers    schedule 29.08.2015


Ответы (3)


Настоящая причина того, почему ключи JSON должны быть в кавычках, зависит от семантики идентификаторов ECMAScript 3.

Зарезервированные слова не могут использоваться в качестве названий свойств в объектных литералах без кавычек, например:

({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...

Хотя, если вы используете кавычки, имена свойств действительны:

({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok

Собственный Крокфорд объясняет это в этом выступлении, они хотели чтобы стандарт JSON оставался простым, и они не хотели бы налагать на него все эти семантические ограничения:

....

Именно тогда мы обнаружили проблему с именами без кавычек. Оказывается, в сценарии ECMA 3 используется политика зарезервированных слов для удаления. Зарезервированные слова нужно цитировать в ключевой позиции, что действительно неприятно. Когда я добрался до формулировки этого стандарта, я не хотел помещать все зарезервированные слова в стандарт, потому что это выглядело бы действительно глупо.

В то время я пытался убедить людей: да, вы можете писать приложения на JavaScript, это действительно будет работать, и это хороший язык. Тогда я не хотел одновременно сказать: и посмотрите на эту действительно глупую вещь, которую они сделали! Поэтому я решил, что вместо этого давайте просто процитируем ключи.
Таким образом, нам не нужно будет никому рассказывать о том, насколько это круто.

Вот почему до сих пор ключи цитируются в JSON.

...

Стандарт ECMAScript 5th Edition исправляет это, теперь в реализации ES5 даже зарезервированные слова могут использоваться без кавычек как в литералах объектов, так и в доступе к членам (obj.function Ok в ES5).

Для протокола: в наши дни этот стандарт внедряется поставщиками программного обеспечения. Вы можете увидеть, какие браузеры включают эту функцию, в этой таблица совместимости (см. Зарезервированные слова как имена свойств)

person Christian C. Salvadó    schedule 17.11.2010
comment
@Mark, пожалуйста. Имейте в виду, что JSON - это просто не зависящий от языка формат обмена данными, даже если его синтаксис был вдохновлен синтаксисом Javascript Object Literal, между ними есть различия (намного больше, чем просто цитируемые ключи) . - person Christian C. Salvadó; 17.11.2010
comment
@CMS, а почему это должны быть только двойные кавычки? Почему одинарные кавычки в JSON недействительны? - person Pacerier; 02.05.2014
comment
Использование одинарных кавычек запрещено, чтобы стандарт JSON был как можно более простым. JSON должен быть только подмножеством Javascript, ему не нужно реализовывать как можно больше Javascript. - person thomasrutter; 10.08.2017
comment
Спецификация надмножества JSON5 придерживается синтаксиса ES5 и, таким образом, среди прочего поддерживает ключи без кавычек. В библиотеке есть совместимые методы parse и stringify. - person Inigo; 04.05.2020
comment
В этой ссылке на таблицу совместимости (внизу ответа) запись Зарезервированные слова находится в разделе Расширения литералов объекта / массива. И TL; DR, все перечисленные браузеры (все, о которых вы слышали, и еще около 20) все говорят «Да». - person i336_; 29.06.2020

Да, это недопустимый JSON, и во многих случаях он будет отклонен, например, в jQuery 1.4+ есть проверка, которая делает незаметный сбой JSON без кавычек. Почему не соответствовать требованиям?

Возьмем другой пример:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }

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

Еще один распространенный пример в мире веб-разработчиков: существуют тысячи примеров недопустимого HTML, который отображается в большинстве браузеров ... делает ли это менее болезненным отладку или поддержку? Вовсе нет, совсем наоборот.

Кроме того, @ Мэтью делает лучшее замечание из всех в комментариях ниже, это уже не работает, ключи без кавычек вызовут синтаксическую ошибку с JSON.parse() во всех основных браузерах (и любых других, которые его реализуют правильно), вы можете протестировать его здесь.

person Nick Craver    schedule 17.11.2010
comment
Да, у меня было несколько старых приложений ajax, генерирующих серверную часть schonky json, которые не работали при обновлении до jquery 1.4 из-за отсутствия двойных кавычек вокруг имен ключей. - person JAL; 17.11.2010
comment
Вы можете добавить, что JSON.parse всех основных браузеров также будет правильно отклонять его. - person Matthew Flaschen; 17.11.2010
comment
Мне любопытно, в каком именно случае JQuery 1.4 молча выйдет из строя с этим типом недопустимого json? - person Mark Rogers; 17.11.2010
comment
@Mark - В любом случае он неправильно процитирован или содержит недопустимые символы ... в основном он не работает с любым недопустимым JSON. - person Nick Craver; 17.11.2010
comment
Это интересно, у меня не было такого опыта работы с JQuery 1.4. Кроме того, я не думаю, что jquery отвечает за создание объектов json, разве это не то, что делает интерпретатор javascript браузера? Вы имеете в виду десериализацию json в JQuery? - person Mark Rogers; 17.11.2010
comment
@Mark Rogers: Да, десериализация не выполняется. Это то, о чем я имел в виду в своем комментарии - у меня была страница PHP, отправляющая json, например {cow:47,duck:"flapping left"}, и при получении через $ .getJSON или $ .ajax с dataType json, с Content-Type application / json, это не удалось. Данные были декодированы в null. Однако этот недопустимый json отлично работал в jQuery 1.3.x. - person JAL; 17.11.2010

YAML, который на самом деле является расширенным набором JSON, поддерживает то, что вы хотите делать. Хотя это расширенный набор, он позволяет сделать его настолько простым, насколько вы хотите.

YAML - это глоток свежего воздуха, и, возможно, стоит потратить время на то, чтобы взглянуть на него. Лучшее место для начала здесь: http://en.wikipedia.org/wiki/YAML

Существуют библиотеки для всех языков под солнцем, включая JS, например https://github.com/nodeca/js-yaml

person user1649339    schedule 26.08.2013
comment
YAML не является расширенным набором JSON. - person John Gibb; 01.04.2014
comment
для получения информации о том, почему: stackoverflow.com/questions/25974485/ - person Ben Page; 29.02.2016