Чи є якась практична причина використовувати рядки з лапками для ключів 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.