Чи потрібно оточувати лапки JSON?


235

Приклад: Чи дійсний наступний код щодо специфікації JSON ?

{
    precision: "zip"
}

Або я завжди повинен використовувати наступний синтаксис? (А якщо так, то чому?)

{
    "precision": "zip"
}

Я нічого не знайшов про це в специфікаціях JSON. Хоча вони використовують лапки навколо своїх ключів у своїх прикладах.

Відповіді:


147

Так, вам потрібні лапки. Це для спрощення та уникнення необхідності використання іншого методу евакуації для зарезервованих ключових слів JavaScript, тобто {for:"foo"}.


12
Цитати в багатьох ситуаціях не простіші, наприклад, конфігураційні файли, які редагуються вручну. Прикра в тому, що JSON використовується (і не використовується) як майже універсальний формат обміну, - це те, що він має особливості, характерні для Javascript.
Мігель

12
Реальна причина - перевірити цю відповідь теж - stackoverflow.com/questions/4201441 / ...
TechMaze

3
Tl; dr: вони не хотіли мати справу з обмеженням ECMAScript на (без котирування) зарезервовані ключові слова як ключі, тому вони просто вимагали цитувати всі ключі.
BallpointBen

136

Ви правильно використовуєте рядки в якості ключа. Ось уривок із RFC 4627 - Тип засобу / json Media для позначення об’єкта JavaScript (JSON)

2.2. Об'єкти

Структура об'єкта представлена ​​у вигляді пари фігурних дужок, що оточують нуль або більше пар імен / значень (або членів). Ім'я - це рядок . Одинарна двокрапка надходить після кожного імені, відокремлюючи ім'я від значення. Одинарна кома відокремлює значення від наступного імені. Імена в межах об’єкта ДОЛЖНІ бути унікальними.

object = begin-object [ member *( value-separator member ) ] end-object

member = string name-separator value

[...]

2.5. Струни

Представлення рядків схоже з умовами, що використовуються в сімействі мов програмування C. Рядок починається і закінчується лапками. [...]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

Прочитайте весь RFC тут .


11
І закінчити думку, розділ 2.5 говорить: A string begins and ends with quotation marks..
rakslice

13

З 2.2. Об'єкти

Структура об'єкта представлена ​​у вигляді пари фігурних дужок, що оточують нуль або більше пар імен / значень (або членів). Ім'я - це рядок.

і від 2,5. Струни

Рядок починається і закінчується лапками.

Тому я б сказав, що відповідно до стандарту: так, ви завжди повинні цитувати ключ (хоча деякі парсери можуть пробачити більше)


7

Так, цитати є обов'язковими. http://json.org/ говорить:

string
    ""
    " chars "

0

Так вони роблять. Але якщо вам потрібно інше, замовте JSON5 .

JSON5 - це набір JSON, який дозволяє синтаксису ES5, включаючи:

  • нецитовані ключі властивостей
  • однорядкові, рятувальні та багаторядкові рядки
  • альтернативні формати чисел
  • коментарі
  • додатковий пробіл

Реалізація посилання JSON5 ( json5пакет npm ) забезпечує JSON5об'єкт, який має parseта stringifyметоди з тими ж аргументами та семантикою, що і вбудований JSONоб'єкт.


-2

Оскільки ви можете поставити крапкові позначення "parent.child" і вам не потрібно ставити parent ["child"], що також є дійсним і корисним, я б сказав, що обидва способи є технічно прийнятними. Усі парсери повинні робити обидва способи просто чудово. Якщо вашому аналізатору не потрібні лапки на клавішах, то, ймовірно, краще не ставити їх (економить місце). Має сенс називати їх рядками, тому що це вони є, а оскільки квадратні дужки дають вам можливість використовувати значення для клавіш, це абсолютно не має сенсу. У Json ви можете поставити ...

>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};

>obj
Object {someKey: "someValue"}

просто чудово без проблем, якщо вам потрібне значення для ключа, і жодне з цитованих не буде працювати, так що якщо це не так, ви не можете, так що вам не буде так "вам не потрібні лапки на клавішах". Навіть якщо правильно сказати, що вони технічно струнні. Логіка та використання аргументують інше. Також він офіційно не виводить Object {"someKey": "someValue"} для obj у нашому прикладі запускається з консолі будь-якого браузера.


2
І прийнята відповідь, і RFC, що визначає JSON, кажуть, що цитати потрібні.
Кіт Томпсон

Це правда, але варто зазначити, що логічно це не потрібно. Я припускаю, що вихідні позначення JavaScript з усіх консолей браузера неправильні, і ми мусимо сказати комусь це виправити. Можливо, те, що консоль браузера виводить на об’єкт, не є JSON, тому, можливо, JSON, визначений специфікацією, не потрібен і не реалізований таким чином у більшості місць. У всякому разі, я просто хотів зробити справу, яка дивиться на факти в іншому світлі. Дійсно, можливо, специфікацію слід змінити тоді, "Цитовані ключі" просто не потрібні ніде, що має значення для мене особисто. (Це просто не використовується таким чином на практиці.)
Майстер Джеймс

2
Ви змішуєте три різні речі: JSON, літеральні об'єкти JavaScript та вихід консолі інструментів для розробників браузера. Коли ви вводите objконсоль, у браузері відображається деяке людське уявлення об’єкта. Він може відображати його як буквальний об'єкт (як це було у вашому прикладі), або він може використовувати інше представлення, навіть інтерактивне. Літеральні об’єкти JavaScript не потребують лапок навколо імені ключа, якщо ключ є дійсним ідентифікатором, а не зарезервованим словом. Однак JSON завжди вимагає лапок навколо ключових імен.
Майкл Гірі

3
Як інші приклади, замість того, щоб вводити objконсоль, спробуйте JSON.stringify(obj). Тепер ви побачите дійсне представлення об'єкта JSON, доповнене цитованою назвою ключа. І навпаки, щоб побачити, чи є строка дійсною JSON, спробуйте JSON.parse(string). Якщо ключі не цитуються, це призведе до виключення. Наприклад, JSON.parse('{"a":"b"}')вдасться, але JSON.parse('{a:"b"}')зазнає невдачі.
Майкл Гірі

1
ОТО, ваше використання var obj = {[keyName]:"someValue"};дуже цікаве! Я не знав, що ви можете це зробити в буквальному об’єкті JavaScript. Трохи перевірки показують, що це щось нове в ES6 - ви не могли цього зробити в ES5.
Майкл Гірі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.