В спецификации JSON говорится, что JSON - это объект или массив. В случае объекта
Структура объекта представлена в виде пары фигурных скобок, окружающих ноль или более пар имя / значение (или членов). Имя - это строка. ...
А позже в спецификации сказано, что строка заключена в кавычки.
Зачем?
Таким образом,
{"Property1":"Value1","Property2":18}
и нет
{Property1:"Value1",Property2:18}
Вопрос 1 : почему бы не позволить имени в парах имя / значение быть идентификаторами без кавычек?
Вопрос 2 : есть ли семантическая разница между двумя приведенными выше представлениями при оценке в Javascript?
javascript
json
Чизо
источник
источник
eval()
(т.е. javascript).Ответы:
Философия дизайна JSON - «Будь проще».
«Цитировать имена с помощью
"
» намного проще, чем «Вы можете цитировать имена с помощью"
или,'
но это не обязательно, если они не содержат определенных символов (или комбинаций символов, которые могут сделать его ключевым словом) и'
или"
могут нуждаться в кавычках в зависимости от по какому разделителю вы выбрали » .Нет. В JavaScript они идентичны.
источник
JSON.parse
функции:JSON.parse('{"a":1}')
работает хорошо , почемуJSON.parse('{a:1}')
вызовет исключение .JSON.parse
- это парсер JSON, реализованный на JavaScript, это не парсер JavaScript.Я оставляю цитату из презентации, которую Дуглас Крокфорд (создатель стандарта JSON) дал Yahoo.
Он рассказывает о том, как он обнаружил JSON, и, среди прочего, почему решил использовать ключи в кавычках :
Вы можете найти полное видео и стенограмму здесь .
источник
{ a }
где свойство 'a' копирует значение глобальной или локальной переменной 'a'.{[key]: value}
В
:
идентификаторах разрешены оба символа и. Без кавычек это вызвало бы двусмысленность при попытке определить, что именно составляет идентификатор.источник
В javascript объекты могут использоваться как хеш / хеш-таблица с парами ключей.
Однако, если в вашем ключе есть символы, которые javascript не может токенизировать как имя, он потерпит неудачу при попытке доступа как к свойству объекта, а не к ключу.
var test = {}; test["key"] = 1; test["#my-div"] = "<div> stuff </div>"; // test = { "key": 1, "#my-div": "<div> stuff </div>" }; console.log(test.key); // should be 1 console.log(test["key"]); // should be 1 console.log(test["#my-div"]); // should be "<div> stuff </div>"; console.log(test.#my-div); // would not work.
идентификаторы иногда могут содержать символы, которые не могут быть оценены как токен / идентификатор в javascript, поэтому лучше всего помещать все идентификаторы в строки для согласованности.
источник
Я думаю, что правильный ответ на вопрос Cheeso заключается в том, что реализация превзошла документацию. Ему больше не требуется строка в качестве ключа, а скорее что-то еще, которое может быть либо строкой (то есть заключенной в кавычки), либо (возможно) чем-либо, что можно использовать в качестве имени переменной, что, как я предполагаю, означает начало с буквы _ , или $, и включать только буквы, цифры, а также $ и _.
Я хотел упростить остальное для следующего человека, который задаст этот вопрос с той же идеей, что и я. Вот мясо:
Имена переменных не интерполируются в JSON при использовании в качестве ключа объекта (спасибо, Фридо!)
Бретон, используя «идентификатор» вместо «ключ», писал, что «если идентификатор оказывается зарезервированным словом, он интерпретируется как это слово, а не как идентификатор». Это может быть правдой, но я без проблем попробовал:
var a = {do:1,long:2,super:3,abstract:4,var:5,break:6,boolean:7}; a.break
=> 6
Об использовании кавычек Квентин написал: «... но вы не обязаны, если [ключ] не содержит определенных символов (или комбинаций символов, которые сделали бы его ключевым словом)»
Я обнаружил, что первая часть (некоторые символы) верна, используя знак @ (на самом деле, я думаю, что $ и _ - единственные символы, которые не вызывают ошибку):
var a = {a@b:1};
=> Синтаксическая ошибка
var a = {"a@b":1}; a['a@b']
=> 1
но скобки в отношении ключевых слов, как я показал выше, неверны.
То, что я хотел, работает, потому что текст между открытием {и двоеточием или между запятой и двоеточием для последующих свойств используется как строка без кавычек для создания ключа объекта или, как выразился Фридо, имя переменной там не ' t интерполируются:
var uid = getUID(); var token = getToken(); // Returns ABC123 var data = {uid:uid,token:token}; data.token
=> ABC123
источник
Если json описывает объекты, то на практике вы получите следующее
var foo = {}; var bar = 1; foo["bar"] = "hello"; foo[bar] = "goodbye";
так что,
foo.bar == "hello"; foo[1] == "goodbye" // in setting it used the value of var bar
поэтому, даже если ваши примеры действительно дают тот же результат, их эквиваленты в «сыром коде» - нет. Может поэтому ?? не знаю, просто идея.
источник
{ bar: 'goodbye' }
не будет устанавливать имя ключа равным значениюbar
, просто будетbar
. Остальные правы в том, почему спецификация требует кавычек: чтобы избежать конфликтов ключевых слов и специальных символов.Это может уменьшить размер данных, если кавычки в имени разрешены только при необходимости
источник