Чи є якась практична причина використовувати рядки з лапками для ключів JSON?


87

Згідно Крокфорд в json.org , JSON об'єкт складається з елементів , які складаються з пар .

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

Рядок - це послідовність з нуля або більше символів Unicode, обгорнутих у подвійні лапки, з використанням екранованих скісних рисок. Символ представлений у вигляді одного символьного рядка. Рядок дуже схожий на рядок C або Java.

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

Чи є сенс турбуватись навколо вашого JSON подвійними лапками?

Дійсний приклад:

{
  "keyName" : 34
}

На відміну від інваліда:

{
   keyName : 34
}

20
"Навіщо турбуватися, щоб зробити це правильно?" Це такий тип лінивого мислення, який призводить до веб-сайтів, завантажених недійсною розміткою. Перспективний код у разі , якщо деякі браузери дійсно вимагають подвійних лапок.
meagar

21
"Навіщо турбуватися, щоб зробити це правильно?" - Навіщо намагатися дотримуватися конвенції, якої не робить ніхто, якщо реальної вигоди немає? Можливо, ви плутаєте ліниве мислення з прагматизмом.
Марк Роджерс

15
@Mark - "що ніхто інший не робить" ... звідки у вас така ідея? серіалізатор JSON, вбудований у кожну основну платформу, робить правильне котирування.
Нік Кравер

7
Функція json_encode @Mark Rogers PHP створює дійсний JSON, наприклад, з подвійними лапками. Можливо, ви думаєте про об’єктні літерали в JavaScript? Правда, вони працюють без цитування ключів, але це не JSON.
JAL,

9
Натомість, багато років тому, коли я опублікував це, я був збентежений різницею між JSON та нотацією літерального об'єкта, як запропонував @JAL. Ці два мають дуже схожий синтаксис, що в підсумку призвело до певної плутанини в описі проблеми.
Марк Роджерс

Відповіді:


155

Справжня причина того, чому ключі JSON мають бути в лапках, покладається на семантику Ідентифікаторів ECMAScript 3.

Зарезервовані слова не можна використовувати як імена властивостей в Object Literals без лапок, наприклад:

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

Якщо ви використовуєте лапки, імена властивостей дійсні:

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

Власний Крокфорд пояснює це в цій бесіді , вони хотіли спростити стандарт JSON, і вони не хотіли б мати всіх цих семантичних обмежень на нього:

....

Тоді ми виявили проблему імен без котирувань. Виявляється, ECMA Script 3 має політику зарезервованих слів. Зарезервовані слова потрібно цитувати у ключовій позиції, що насправді є неприємністю. Коли я дійшов до того, щоб сформулювати це в стандарт, я не хотів вносити всі зарезервовані слова в стандарт, тому що це виглядало б по-справжньому дурним.

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

Ось чому донині ключі цитуються в JSON.

...

ECMAScript 5th Edition Standard це виправляє, тепер у реалізації ES5 навіть зарезервовані слова можна використовувати без лапок, як в Object literals, так і в доступі членів ( obj.functionOk in ES5).

Тільки для протоколу, цей стандарт сьогодні впроваджується постачальниками програмного забезпечення, ви можете побачити, які браузери включають цю функцію в цій таблиці сумісності (див. Зарезервовані слова як назви властивостей )


1
@Mark, ласкаво просимо. Майте на увазі, що JSON - це просто мовно-агностичний формат обміну даними, навіть якщо його синтаксис був натхненний синтаксисом Javascript Object Literal, між ними є відмінності (набагато більше, ніж просто цитовані ключі).
Крістіан С. Сальвадо,

2
@CMS, то чому це повинні бути лише подвійні лапки? Чому одинарні лапки недійсні в JSON?
Pacerier

1
Поодинокі лапки заборонені, щоб стандарт JSON був якомога простішим. JSON має бути лише підмножиною Javascript, йому не потрібно реалізовувати якомога більше Javascript.
thomasrutter

JSON5 суперсет специфікацію дотримується синтаксису ES5 і , таким чином , підтримує некотируваних ключі серед інших речей. Бібліотека має сумісні parseта stringifyметоди.
Ініго,

У цьому посиланні на таблицю сумісності (внизу відповіді) запис Зарезервовані слова знаходиться в розділі Розширення літералу Об’єкт / масив . І TL; DR, усі перелічені браузери (усі, про які ви чули та ще близько 20), відповідають "так".
i336_

16

Так, це недійсний JSON, інакше в багатьох випадках його буде відхилено, наприклад, jQuery 1.4+ має перевірку, яка робить JSON без котирувань мовчки невдалим. Чому б не бути поступливим?

Візьмемо ще один приклад:

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

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

Ще один поширений приклад у світі веб-розробників: Є тисячі прикладів неприпустимого HTML, який відображається у більшості браузерів ... чи не робить це менш болісним налагодження чи обслуговування? Зовсім не, навпаки.

Крім того, @ Matthew робить найкраще з усіх коментарів нижче, це вже не вдається, клавіші без котирувань видають синтаксичну помилку JSON.parse()у всіх основних браузерах (та будь-яких інших, які це правильно реалізують), ви можете перевірити це тут .


Так, у мене було кілька старих програм ajax, які генерували сторону сервера schonky json, яка не вдалася при оновленні до jquery 1.4 через відсутність подвійних лапок навколо назв ключів.
JAL,

Ви можете додати, що всі основні браузери JSON.parseтакож правильно відхилять його.
Метью Флашен,

Мені цікаво, в якому випадку саме JQuery 1.4 мовчки не спрацює з таким типом недійсного json?
Марк Роджерс

1
@Mark - У будь-якому випадку він неправильно цитується або містить недійсні символи ... в основному він зазнає невдачі з будь-яким недійсним JSON.
Нік Кравер

Це цікаво, але це не був мій досвід роботи з JQuery 1.4. Крім того, я не думаю, що jquery відповідає за створення об'єктів json, чи не це робить інтерпретатор javascript браузера? Ви маєте на увазі десериалізацію Jquery json?
Марк Роджерс

-4

YAML, який насправді є надмножиною JSON, підтримує те, що ви хочете зробити. Хоча це і є надмножиною, вона дозволяє вам залишати її якомога простішою.

YAML - це ковток свіжого повітря, і, можливо, варто витратити ваш час, щоб поглянути на нього. Найкраще місце для початку - тут: http://en.wikipedia.org/wiki/YAML

Є бібліотеки для кожної мови під сонцем, включаючи JS, наприклад https://github.com/nodeca/js-yaml


11
YAML не є надмножиною JSON.
Джон Гібб,

для інформації про те, чому: stackoverflow.com/questions/25974485/…
Бен Пейдж
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.